SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡
项目地址:https://github.com/gongxianshengjiadexiaohuihui/SpringCloudDemo
RestTemplate 是 Spring Resources 中一个访问第三方 Restful API 接口的网络请求框架。
RestTemplate 是用来消费 REST 服务的,所以 RestTemplate 的主要方法都与 REST 的 H即 协议的一些方法紧密相连,例如 HEAD、 GET、 POST、 PUT、 DELETE 和 OPTIONS 等方法, 这些方法在 RestTemplate 类对应的方法为 headFor Headers()、 getForObject()、 postForObject()、 put()和 delete(),RestTemplate 支持常见的 Http 协议的请求方法,例如 Post、 Put、 Delete 等,所以用 RestTemplate 很容易构建 Restful API
接着谈一下什么是负载均衡,负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。 一种是独立进 程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix。另一种是将负载 均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供 者的信息列表,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负 载均衡的目的。如何Netflix公司的Ribbon
还是用接着上一节的代码进行扩展,不过要添加一个Module工程,名字为eureka-ribbon-client,作为服务消费者,通过RestTemplate来消费eureka-client的服务,先为erureka-client创建一个服务
@RestController
public class HiController {
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String home(@RequestParam String name){
return "hi "+name+",i am from port:" +port;
}
}
eureka-ribbon-client的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eureka-ribbon-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-ribbon-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>spring-cloud</groupId>
<artifactId>eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
eureka-ribbon-client配置文件
spring:
application:
name: eureka-ribbon-client
server:
port: 8764
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
配置RestTemplate的负载均衡策略
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
利用RestTemplate去消费服务
@Service
public class RibbonService {
@Autowired
RestTemplate restTemplate;
public String hi(String name){
return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
}
}
Controller层
@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService;
@GetMapping("/hi")
public String hi(@RequestParam(required=false,defaultValue="ggp") String name){
return ribbonService.hi(name);
}
}
配置完成了 然后就是我们的启动类 和eureka-client一样,因为他们都是客户端,但是既可以是服务提供者,又可以是服务消费者,可以看一下我上一篇发的图
@SpringBootApplication
@EnableEurekaClient
public class EurekaRibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaRibbonClientApplication.class, args);
}
}
还是向上一篇一样启动两个server,不过这次eureka-client要启动两个,这样才能体现我们的负载均衡。
启动第二个eureka-client的时候需要更改端口号
去掉Single instantce only 前面的对号就可以了
最后启动eureka-ribbon-client
启动成功后我们两个server都可以看到,这些服务已经被注册
红色部分是eureka的自我保护模式,可以参考我的第一篇。
接着访问http://localhost:8764/hi?name=ggp
会发现,eureka-ribbon-client会交替的访问8762和8763这两个端口,说明负载均衡策略已经生效
此时的结构如下图
负载均衡器的核心类为 LoadBalancerClient, LoadBalancerClient 可以获取负载均衡的服务提 供者的实例信息
验证一下
在eureka-ribbon-client的controller加一部分代码
@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService;
@GetMapping("/hi")
public String hi(@RequestParam(required=false,defaultValue="ggp") String name){
return ribbonService.hi(name);
}
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("test")
public String testRibbon(){
ServiceInstance serviceInstance=loadBalancerClient.choose("eureka-client");
return serviceInstance.getHost()+":"+serviceInstance.getPort();
}
}
启动访问http://localhost:8764/test
负载均衡 器 LoadBalancerClient 是从 Eureka Client 获取服务注册列表信息的,并将服务注册列表信息缓存 了一份。 在 LoadBalancerCJient 调用 choose()方法时,根据负载均衡策略选择一个服务实例的 信息,从而进行了负载均衡。 LoadBalancerClient 也可以不从 Eureka Client获取注册列表信息, 这时需要自己维护一份服务注册列表信息。
还没有评论,来说两句吧...