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文件



    4.0.0

    com.example
    eureka-ribbon-client
    0.0.1-SNAPSHOT
    jar

    eureka-ribbon-client
    Demo project for Spring Boot

    
        spring-cloud
        eureka
        1.0-SNAPSHOT
        
    

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    


    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    



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的时候需要更改端口号

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第1张图片

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

最后启动eureka-ribbon-client

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

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第2张图片

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

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

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第3张图片

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第4张图片

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

此时的结构如下图

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第5张图片

负载均衡器的核心类为 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

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第6张图片

SpringCloud学习笔记(三)RestTemplate和Ribbon负载均衡_第7张图片

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

参考资料:《深入理解spring+cloud与微服务构建》

你可能感兴趣的:(SpringCloud)