0
点赞
收藏
分享

微信扫一扫

SpringCloud之远程消费

桑二小姐 2022-02-14 阅读 71


 

<spring-boot.version>2.4.1</spring-boot.version>
<spring-cloud.version>2020.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>


nacos     

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>


服务如何让nacos发现?

使用RestTemplate

方式一 http://127.0.0.1:8081/run    直接用路径访问

方式二(集群+负载均衡使用Feign(开启负载均衡)     
 

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

使用Feign(开启负载均衡)

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

步骤一 生产者提供接口 可以使用以下几个注解接收远程调用的参数值

@PathVariable

@RequestParam

@RequestBody

@RestController
只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求,同时生产者必
须支持POST请求并给参数添加@RequestBody注解
步骤二
消费者需要开启Feign功能
创建Server,并使用Feign表示其需要远程对接的服务名称,并使用@RequestMapping表示其映射的
路径
@RequestMapping("/user")
@Slf4j
public class UserController {
@RequestMapping("/{account}")
public String getByPath(@PathVariable String account) {
log.info("account:" + account);
return "provider say : yes";
}
@RequestMapping("/param")
public String getByParam(@RequestParam("account") String account,
@RequestParam("password") String password) {
log.info("param:" + account + "\t" + password);
return "provider say : yes";
}
@RequestMapping("/pojo")
public String getByPojo(@RequestBody UserDto user) {
log.info("pojo:" + user);
return "provider say : yes";
}
@RequestMapping("/more")
public String getByMore(@RequestBody Map<String, Object> map) {
log.info("more:" + map);
return "provider say : yes";
}
}


只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求,同时生产者必须支持POST请求并给参数添加@RequestBody注解
 

步骤二 消费者需要开启Feign功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
}

创建Server,并使用Feign表示其需要远程对接的服务名称,并使用@RequestMapping表示其映射的 路径

@FeignClient("provider")
public interface FeignUserService {
@RequestMapping("/user/{account}")
public String getByPath(@PathVariable(value = "account") String account);
@RequestMapping("/user/param")
FeignClient接口,不能使用@GettingMapping之类的组合注解
FeignClient接口中,如果使用到@PathVariable必须指定其value
当使用feign传参数的时候,需要加上@RequestParam注解,否则对方服务无法识别参数
DTO封装
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据
封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是
为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的
性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一
一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应
PO的一个(或若干个)属性。
消费者 远程调用 生产者 : 需要网络传输,使用DTO同一封装对象
原理与SpringBoot启动类相同
1.将DTO对象封装到公共DTO模块
2.为需要的项目引入公共DTO模块
注意点
public String getByParam(@RequestParam("account") String account,
@RequestParam("password") String password);
@RequestMapping("/user/pojo")
public String getByPojo(@RequestBody UserDto user);
@RequestMapping("/user/more")
public String getByMore(@RequestBody Map<String, Object> map);
}



 
 
Orika     
Orika是java Bean映射框架,可以实现从一个对象递归拷贝数据至另一个对象。
在开发多层应用程序中非常有用。在这些层之间交换数据时,通常为了适应不同API需要转换一个实例至另一个实例。
 
 

 

 

举报

相关推荐

0 条评论