Spring Cloud远程消费
1.导入依赖
其他依赖见Spring Cloud-CSDN博客
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.集群+负载均衡
使用Feign(开启负载均衡)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
步骤一
生产者提供接口
可以使用以下几个注解接收远程调用的参数值
@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
的一个(或若干个)属性。

消费者远程调用生产者: 需要网络传输,使用DTO同一封装对象
原理与
SpringBoot
启动类相同
1.
将
DTO
对象封装到公共
DTO
模块
2.
为需要的项目引入公共
DTO
模块
注意点
1.
不需要继承父模块
(
重复引用问题
)
2.
打包方式为
jar
3.
不需要添加启动类的编译
4.Orika
Orika
是
java Bean
映射框架,可以实现从一个对象递归拷贝数据至另一个对象。
在开发多层应用程序中非常有用。在这些层之间交换数据时,通常为了适应不同
API需要转换一个实例至另一个实例。
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.4.6</version>
</dependency>
UserVo -> User
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String account;
private String password;
}