SpringCloud-day05-服务调用Ribbon

6.服务调用Ribbon

6.1Ribbon简介

  前面讲了eureka服务注册与发现,但是结合eureka集群的服务调用并没有谈到。这里就要用到Ribbon,结合eureka,来实现服务的调用;

  Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。

Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

Ribbon与Eureka配合使用时的架构如下图:

  SpringCloud-day05-服务调用Ribbon_第1张图片

6.2.Ribbon简单实用

  Ribbon是客户端负载均衡,所以肯定集成再消费端,也就是consumer端

  我们修改microservice-ticket-consumer-80

  第一步: microservice-station-consumer-80,引入依赖,pom.xml 加入 ribbon相关依赖

 1  
 2         <dependency>
 3             <groupId>org.springframework.cloudgroupId>
 4             <artifactId>spring-cloud-starter-eurekaartifactId>
 5         dependency>
 6         <dependency>
 7             <groupId>org.springframework.cloudgroupId>
 8             <artifactId>spring-cloud-starter-ribbonartifactId>
 9         dependency>
10         <dependency>
11             <groupId>org.springframework.cloudgroupId>
12             <artifactId>spring-cloud-starter-configartifactId>
13         dependency>

 

 

  第二步: microservice-station-consumer-80 的 application.yml如下

 1 server:
 2   port: 80
 3   context-path: /
 4 
 5 # 客户端负载均衡配置
 6 eureka:
 7   client:
 8     register-with-eureka: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
 9     service-url:
10       defaultZone: http://eureka2001.wfd360.com:2001/eureka/,http://eureka2002.wfd360.com:2002/eureka/,http://eureka2003.wfd360.com:2003/eureka/

 

 

  第三步:ribbon结合eureka来调用服务提供者,SpringCloudConfig也改成 要加个负载均衡配置 @LoadBalanced

  SpringCloud-day05-服务调用Ribbon_第2张图片

 

  第四步:因为和eureka整合,所以启动类TicketConsumerApplication_80 加个注解 @EnableEurekaClient

  SpringCloud-day05-服务调用Ribbon_第3张图片

 

  第五步:在服务提供者microservice-ticket-provider-1001的application.yml加下配置,指定下应用名称:

  application:

      name: microservice-ticket

  直观图如下:

  SpringCloud-day05-服务调用Ribbon_第4张图片

  

  第六步:修改下TicketConsumerController的URL,改成指定的微服务应用名称,在第五步中我们的服务名称为:microservice-student

      代码如下:private static final String URL="http://MICROSERVICE-TICKET/ticket";  // 特别注意 这里需要添加访问的一级地址 ticket,为了引起大家注意,提供的代码中没有这个

  控制层全部代码如下:

 1 package com.wfd360.controller;
 2 
 3 import com.wfd360.model.Ticket;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.stereotype.Controller;
 6 import org.springframework.web.bind.annotation.*;
 7 import org.springframework.web.client.RestTemplate;
 8 
 9 import java.util.List;
10 
11 /**
12  * Created by 姿势帝-博客园 on 2019/3/26.
13  * 欢迎添加笔者wx(851298348)共同探讨、学习!
14  */
15 
16 /**
17  * 知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
18  */
19 @Controller
20 @RequestMapping("/ticket")
21 public class TicketConsumerController {
22     @Autowired
23     private RestTemplate restTemplate;
24 
25     /**
26      *服务提供者名称  microservice-ticket
27      * 服务调用者这边的控制器里 url =  http://MICROSERVICE-TICKET
28      */
29     private static final String URL="http://MICROSERVICE-TICKET/";
30 
31     /**
32      * 添加或者修改车票信息
33      *
34      * @param ticket
35      * @return
36      */
37     @PostMapping(value = "/save")
38     @ResponseBody
39     public boolean save(Ticket ticket) {
40         System.out.println("======su=====save=========");
41        // return restTemplate.postForObject("http://localhost:1001/ticket/save", ticket, Boolean.class);
42         return restTemplate.postForObject(URL+"/save", ticket, Boolean.class);
43     }
44 
45     /**
46      * 查询车票信息
47      *
48      * @return
49      */
50     @SuppressWarnings("unchecked")
51     @GetMapping(value = "/list")
52     @ResponseBody
53     public List list() {
54        // return restTemplate.getForObject("http://localhost:1001/ticket/list", List.class);
55         return restTemplate.getForObject(URL+"/list", List.class);
56     }
57 
58     /**
59      * 根据id查询车票信息
60      *
61      * @return
62      */
63     @GetMapping(value = "/get/{id}")
64     @ResponseBody
65     public Ticket get(@PathVariable("id") Integer id) {
66        // return restTemplate.getForObject("http://localhost:1001/ticket/get/" + id, Ticket.class);
67         return restTemplate.getForObject(URL+"/get/" + id, Ticket.class);
68     }
69 
70     /**
71      * 根据id删除车票信息
72      *
73      * @return
74      */
75     @GetMapping(value = "/delete/{id}")
76     @ResponseBody
77     public boolean delete(@PathVariable("id") Integer id) {
78         try {
79            // restTemplate.getForObject("http://localhost:1001/ticket/delete/" + id, Boolean.class);
80             restTemplate.getForObject(URL+"/delete/" + id, Boolean.class);
81             return true;
82         } catch (Exception e) {
83             return false;
84         }
85     }
86 }
View Code

 

 

   第七步:测试 ,先启动3个注册中心,在启动服务提供者,最后启动消费者

        访问:http://localhost/ticket/list ,结果如下,则配置成功

  SpringCloud-day05-服务调用Ribbon_第5张图片

  ribbon的基本使用结束,案例代码见 v5版本!

转载于:https://www.cnblogs.com/newAndHui/p/10622012.html

你可能感兴趣的:(java,网络)