2.服务的调用
2.1 LoadBalancer整合RestTemplate实现调用其他微服务
2.1.1 介绍
2.1.1.1 RestTemplate简介
RestTemplate是Spring Resources中一个访问第三方RESTful API接口的网络请求框架。RestTemplate的设计原则和其他的Spring Template(例如JdbcTemplate)类似,都是为了执行复杂任务提供了一个具有默认行为的简单方法。
RestTemplate是用来消费REST服务的,所以RestTemplate的主要方法都与REST的HTTP协议的一些方法紧密相连,例如HEAD、GET、POST、PUT、DELETE、OPTIONS等方法,这些方法在RestTemplate类对应的方法为headForHeaders(),getForObject()、postForObject()、put()、delet()等。
RestTemplate支持常见的Http协议请求方法,例如post, get, delete等,所以用RestTemplate很容易构建RESTfule API
2.1.1.2 LoadBalancer负载均衡
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。一种独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如Nginx。另一种是将负载均衡逻辑一代吗的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
SpringCloud原有的客户端负载均衡方案Ribbon已经被废弃,取而代之的是SpringCloud LoadBalancer,LoadBalancer是Spring Cloud Commons的一个子项目,他属于上述的第二种方式,是将负载均衡逻辑封装到客户端中,并且运行在客户端的进程里。
在Spring Cloud构件微服务系统中,LoadBalancer作为服务消费者的负载均衡器,有两种使用方式,一种是和RestTemplate相结合,另一种是和Feign相结合,Feign已经默认集成了LoadBalancer
2.1.2 LoadBalancer整合RestTemplate
2.1.2.1 服务者(payment)
- 配置yml文件
在application.yml配置文件中,使用spel指定端口,表示存在port参数使用port参数,不存在使用默认9001端口, 启动服务时,可以通过指定-Dport=9000,指定服务使用不同端口启动
server
port: ${port:9001}
- 配置Controller层供调用者调用
@RestController
@RequestMapping("/payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/{id}")
public ResponseEntity<String> payment(@PathVariable("id")Integer id){
return ResponseEntity.ok("订单号=" + id + ",支付成功,server.port=" + serverPort);
}
2.1.2.2 消费者(order)
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
//提供负载均衡以及整合RestTemplate
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 在启动器类中配置LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 配置Controller层
//注入RestTemplate实现调用其他服务
@Autowired
private RestTemplate restTemplate;
//配置接口以及调用resttemplate方法
@GetMapping("/lb/{id}")
public ResponseEntity<String> getPayMentByLb(@PathVariable("id") Integer id){
//payment-service指的是服务者的application name
String result = restTemplate.getForObject("http://payment-service" + "/payment/" + id,String.class);
return ResponseEntity.ok(result);
}
2.1.2.3 启动并测试
启动两个消费者微服务工程,端口分别是9002和9001,配置如下
多次访问订单微服务下的接口。负载均衡起了作用,端口9001,9002轮流出现
2.2 调用OpenFeign通过PaymentClient实现调用其他微服务
2.2.1 介绍
Feign是一个声明式的HTTP客户端组件,它旨在是编写Http客户端变得更加容易。OpenFeign添加了对于Spring MVC注解的支持,同时集成了Spring Cloud LoadBalancer和Spring Cloud CircuitBreaker,在使用Feign时,提供负载均衡和熔断降级的功能
2.2.2 简单使用
- 消费者微服务工程下添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency
- 开启Feign功能
使用@EnableFeignClients开启Feign功能
- 创建Feign客户端
在注解@FeignClient注解中,“payment-service”是服务名,使用这个名字来从Eureka服务列表中得到相应的服务,来创建LoadBalancer客户端,也可以使用url属性,指定服务的URL
-
在controller层进行调用
-
启动服务者端口9001,9002,以及消费者服务器工程,访问地址,实现Feign集成负载均衡LoadBalancer组件