栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCloud远程消费

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCloud远程消费

(一)定义好连接远程的方法,请参考SpringCloud基本使用的代码 运行效果如下:

 

 

(二)消费者和生产者远程调用接口定义 注:在写下面代码之前,请先完成上面的操作  1.在生产者nacos_provider模块中先定义一个user实体类
package com.provider.code.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User {

    private String account;
    private String password;

}
2.在controller中定义请求方法
package com.provider.code.controller;

import com.provider.code.pojo.User;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {

    //路径传参
    @RequestMapping("/{account}")
    private String getByPath(@PathVariable String account){
        System.out.println("account路径传参效果:"+account);
        return "provider say: yes";
    }

    //请求直接携带
    @RequestMapping("/param")
    private String getByParam(@RequestParam("account") String account,@RequestParam("password") String password){
        System.out.println("请求直接携带account:"+account+"password:"+password);
        return "provider say: yes";
    }

    //直接携带对象,json的格式
    @RequestMapping("/pojo")
    private String getByPojo(@RequestBody User user){
        System.out.println("直接携带对象pojo:"+user);
        return "provider say: yes";
    }

    //map集合,json的格式
    @RequestMapping("/more")
    private String getByMore(@RequestBody Map map){
        System.out.println("map集合more:"+map);
        return "provider say: yes";
    }

}
注:控制台输出效果如下

 注:传输json格式的方法,需要在Body中,手动用json格式写入要传输的参数和数值

 

(三)Feign远程调用   1.在父类的pom.xml中导入远程通信的依赖

  org.springframework.cloud
  spring-cloud-starter-openfeign
2.在nacos_consumer消费者模块中写入实体类和service层方法
package com.consumer.code.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User {

    private String account;
    private String password;

}
package com.consumer.code.service;

import org.apache.catalina.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@FeignClient("provider")
public interface FeignUserService {


    @RequestMapping("/user/{account}")
    String getByPath(@PathVariable String account);

    @RequestMapping("/user/param")
     String getByParam(@RequestParam("account") String account,@RequestParam("password") String password);

    @RequestMapping("/user/pojo")
     String getByPojo(@RequestBody User user);


    @RequestMapping("/user/more")
    String getByMore(@RequestBody Map map);

}
3.在消费者启动类中加上@EnableFeignClients注解,开启Feign功能

 

 4.在nacos_consumer消费者模块中新建controller类,写入远程访问的方法
package com.consumer.code.controller;

import com.consumer.code.pojo.User;
import com.consumer.code.service.FeignUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private FeignUserService service;

    @RequestMapping("/test01")
    public String  test01(String account){
        service.getByPath(account);
        return "yes";
    }

    @RequestMapping("/{account}")
    public String  test02(@PathVariable String account){
        service.getByPath(account);
        return "yes";
    }

    @RequestMapping("/test03")
    public String  test03(String account,String password){
        service.getByParam(account,password);
        return "yes";
    }

    @RequestMapping("/test04")
    public String  test04(String account,String password){
        service.getByPojo(new User().setAccount(account).setPassword(password));
        return "yes";
    }

    @RequestMapping("/test05")
    public String  test05(String account,String password){
        Map map =new HashMap<>();
        map.put("account",account);
        map.put("password",password);
        service.getByMore(map);
        return "yes";
    }






}
注:开启生产者和消费者启动类,运行效果如下

(四)DTO构建  1.新建一个SpringBoot项目,作为公共的启动器,用来存放公共的代码

 2.在commons启动器的pom.xml中引入lombok的依赖

注:记得把test的依赖删掉


    org.projectlombok
    lombok
3.把启动器模块打成架包 

 

4.把启动类的依赖写入到父模块中 在父模块中引入启动器这个模块

 

注:不需要在启动器模块中继承父模块


  com.colude02
  code
  0.0.1-SNAPSHOT
5.可以把消费者中的实体类删除掉,然后把user对象该成调用userDto对象

 运行效果如下:

 注:问题1,如果dto实体中的属性,和消费者中的实体对象一致,可以使用以下方法去数据库中拿到对应的属性
问题2:如果dto里面的名字和实体里面的名字不一致,可以使用第二种方法进行修改

注:1.使用第二中方法之前需要先在消费者模块的pom.xml导入下面的依赖


    org.springframework.cloud
    spring-cloud-loadbalancer

       2.在生产者模块的启动类中写入一个方法MapperFactory的方法,再加上@Scope(prototype)注解

 

注:记得在UserContoler中注入MapperFactory

 

 

使用场景(如果对象中属性太多,普通逻辑处理代码太多)

    A对象复制到B对象(对象复制)
//业务场景,将A对象复制B对象中
//1.普通逻辑处理
User A = new User().setId("123").setName("1231");
UserVo B = new UserVo().setId(A.getId()).setName(A.getName());
System.out.println("普通方式将A对象复制B对象中:"+B);

//使用orika复制工具将A复制到B对象中
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
UserVo map = mapperFactory.getMapperFacade().map(A, UserVo.class);
System.out.println("orika复制对象:"+map);

由上得出控制台输出如下:

普通方式将A对象复制B对象中:UserVo(id=123, name=1231)

orika复制对象:UserVo(id=123, name=1231)

 2.A集合复制到B集合(集合复制)

//1.普通逻辑处
//A对象
List A = Arrays.asList(new User().setId("123").setName("张三"));
//B对象
List B = new ArrayList<>();
//将A集合数据复制到B集合中
A.forEach(x->{
B.add( new UserVo().setId(x.getId()).setName(x.getName()));
});
System.out.println("将A集合中数据set到B集合中数据打印");

//使用orika复制工具将A集合复制到B集合中
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
List userVo = mapperFactory.getMapperFacade().mapAsList
mapperFactory.getMapperFacade().mapAsList(A, UserVo.class);
System.out.println("orika直接复制对象集合打印结果:"+userVo);

由上得出控制台输出如下:

 

将A集合中数据set到B集合中数据打印:[UserVo(id=123, name=张三)]`

`orika直接复制对象集合打印结果:[UserVo(id=123, name=张三)]`

到此为止您已经算入门了,以上是Orika的基础使用,由此发现如果对象中属性如果20个,那么用普通的逻辑处理需要20个set过去,如果用Orika两行代码搞定。话不多说关键步骤总结一波(关键必须牢记):

 

MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.getMapperFacade().map(操作对象)
mapperFactory.getMapperFacade().mapAsList(操作集合对象)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/735614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号