Spring Cloud远程消费

1.导入依赖

其他依赖见Spring Cloud-CSDN博客


com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery


org.springframework.cloud
spring-cloud-starter-loadbalancer

2.集群+负载均衡

使用Feign(开启负载均衡)


org.springframework.cloud
spring-cloud-starter-openfeign
步骤一
生产者提供接口
可以使用以下几个注解接收远程调用的参数值
@PathVariable
@RequestParam
@RequestBody
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @RequestMapping("/{account}")
    public String getByPath(@PathVariable("account") String account) {
        log.info("account:{}",account);
        return "";
    }


    @RequestMapping("/param")
    public String getByParam(@RequestParam("account") String account,@RequestParam("password") String password) {
        log.info("account:{},password:{}",account,password);
        return "";
    }
    @RequestMapping("/pojo")
    public String getByPojo(@RequestBody UserDto dto) {
        //将dto中与User相关的属性拿出来给到User对象
        User user=new User();
        BeanUtils.copyProperties(dto,user);
        log.info("user:{}",user);
        return "";
    }

}
只要参数是复杂对象,即使指定了是 GET 方法, feign 依然会以 POST方法进行发送请求,同时生产者必须支持 POST 请求并给参数添加 @RequestBody 注解
步骤二
消费者需要开启 Feign 功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {

}
创建 Server, 并使用 Feign 表示其需要远程对接的服务名称 , 并使用 @RequestMapping 表示其映射的
路径
@FeignClient("provider")
public interface FeignUserService {

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

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

    @RequestMapping("/user/pojo")
    String getByPojo(@RequestBody UserDto dto);
}
FeignClient 接口 , 不能使用 @GettingMapping 之类的组合注解
FeignClient 接口中,如果使用到 @PathVariable 必须指定其 value
当使用 feign 传参数的时候 , 需要加上 @RequestParam 注解 , 否则对方服务无法识别参数

3.DTO封装

VO View Object ):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据
封装起来。
DTO Data Transfer Object ):数据传输对象,这个概念来源于 J2EE 的设计模式,原来的目的是
为了 EJB 的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的
性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO Domain Object ):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO Persistent Object ):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一
一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应
PO 的一个(或若干个)属性。

 Spring Cloud远程消费_第1张图片

消费者远程调用生产者: 需要网络传输,使用DTO同一封装对象 

原理与 SpringBoot 启动类相同
1. DTO 对象封装到公共 DTO 模块
2. 为需要的项目引入公共 DTO 模块

 注意点

1. 不需要继承父模块 ( 重复引用问题 )
2. 打包方式为 jar
3. 不需要添加启动类的编译

4.Orika

Orika java Bean 映射框架,可以实现从一个对象递归拷贝数据至另一个对象。
在开发多层应用程序中非常有用。在这些层之间交换数据时,通常为了适应不同 API需要转换一个实例至另一个实例。
  
  ma.glasnost.orika
  orika-core
  1.4.6
UserVo -> User
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String account;
    private String password;
}

你可能感兴趣的:(spring,cloud,spring,后端)