欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

SpringCloud远程消费

时间:2023-06-18
(一)定义好连接远程的方法,请参考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().mapAsListmapperFactory.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(操作集合对象)

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。