SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡

朱雀 2021-01-21 01:57 815阅读 0赞

项目地址: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创建一个服务

  1. @RestController
  2. public class HiController {
  3. @Value("${server.port}")
  4. String port;
  5. @GetMapping("/hi")
  6. public String home(@RequestParam String name){
  7. return "hi "+name+",i am from port:" +port;
  8. }
  9. }

eureka-ribbon-client的pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>eureka-ribbon-client</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>eureka-ribbon-client</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>spring-cloud</groupId>
  13. <artifactId>eureka</artifactId>
  14. <version>1.0-SNAPSHOT</version>
  15. <relativePath/>
  16. </parent>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-web</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-test</artifactId>
  33. <scope>test</scope>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

eureka-ribbon-client配置文件

  1. spring:
  2. application:
  3. name: eureka-ribbon-client
  4. server:
  5. port: 8764
  6. eureka:
  7. client:
  8. serviceUrl:
  9. defaultZone: http://peer1:8761/eureka/

配置RestTemplate的负载均衡策略

  1. @Configuration
  2. public class RibbonConfig {
  3. @Bean
  4. @LoadBalanced
  5. RestTemplate restTemplate(){
  6. return new RestTemplate();
  7. }
  8. }

利用RestTemplate去消费服务

  1. @Service
  2. public class RibbonService {
  3. @Autowired
  4. RestTemplate restTemplate;
  5. public String hi(String name){
  6. return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
  7. }
  8. }

Controller层

  1. @RestController
  2. public class RibbonController {
  3. @Autowired
  4. RibbonService ribbonService;
  5. @GetMapping("/hi")
  6. public String hi(@RequestParam(required=false,defaultValue="ggp") String name){
  7. return ribbonService.hi(name);
  8. }
  9. }

配置完成了 然后就是我们的启动类 和eureka-client一样,因为他们都是客户端,但是既可以是服务提供者,又可以是服务消费者,可以看一下我上一篇发的图

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class EurekaRibbonClientApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaRibbonClientApplication.class, args);
  6. }
  7. }

还是向上一篇一样启动两个server,不过这次eureka-client要启动两个,这样才能体现我们的负载均衡。

启动第二个eureka-client的时候需要更改端口号

70

70 1

去掉Single instantce only 前面的对号就可以了

最后启动eureka-ribbon-client

启动成功后我们两个server都可以看到,这些服务已经被注册

70 2

红色部分是eureka的自我保护模式,可以参考我的第一篇。

接着访问http://localhost:8764/hi?name=ggp

70 3

70 4

会发现,eureka-ribbon-client会交替的访问8762和8763这两个端口,说明负载均衡策略已经生效

此时的结构如下图

70 5

负载均衡器的核心类为 LoadBalancerClient, LoadBalancerClient 可以获取负载均衡的服务提 供者的实例信息

验证一下

在eureka-ribbon-client的controller加一部分代码

  1. @RestController
  2. public class RibbonController {
  3. @Autowired
  4. RibbonService ribbonService;
  5. @GetMapping("/hi")
  6. public String hi(@RequestParam(required=false,defaultValue="ggp") String name){
  7. return ribbonService.hi(name);
  8. }
  9. @Autowired
  10. private LoadBalancerClient loadBalancerClient;
  11. @GetMapping("test")
  12. public String testRibbon(){
  13. ServiceInstance serviceInstance=loadBalancerClient.choose("eureka-client");
  14. return serviceInstance.getHost()+":"+serviceInstance.getPort();
  15. }
  16. }

启动访问http://localhost:8764/test

70 6

70 7

负载均衡 器 LoadBalancerClient 是从 Eureka Client 获取服务注册列表信息的,并将服务注册列表信息缓存 了一份。 在 LoadBalancerCJient 调用 choose()方法时,根据负载均衡策略选择一个服务实例的 信息,从而进行了负载均衡。 LoadBalancerClient 也可以不从 Eureka Client获取注册列表信息, 这时需要自己维护一份服务注册列表信息。

发表评论

表情:
评论列表 (有 0 条评论,815人围观)

还没有评论,来说两句吧...

相关阅读