1. 程式人生 > 實用技巧 >SpringBoot+SpringCloud+vue+Element開發專案——服務消費(Ribbon、Feign)

SpringBoot+SpringCloud+vue+Element開發專案——服務消費(Ribbon、Feign)

一、服務提供者

1、新建一個專案jansens-producer、新增依賴

  • Swagger:API文件。
  • Consul:註冊中心。
  • Spring Boot Admin:服務監控。

pom.xml

<properties>
  <swagger.version>2.9.2</swagger.version>
  <spring.boot.admin.version>2.0.4</spring.boot.admin.version>
    </properties>
<!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <!--spring-boot-admin-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>${spring.boot.admin.version}</version>
        </dependency>
        <!--consul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

2、配置檔案

application.yml

server:
  port: 8003
spring:
  application:
    name: jansens-producer
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        serviceName: ${spring.application.name}    # 註冊到consul的服務名稱
  boot:
    admin:
      client:
        url: "http://localhost:8000"
# 開放健康檢查介面
management:
  endpoints:
    web:
      exposure:
        include: 
"*" endpoint: health: show-details: ALWAYS

3、啟動類

JansensProducerApplication.java

@EnableDiscoveryClient
@SpringBootApplication
public class JansensProducerApplication {

    public static void main(String[] args){
        SpringApplication.run(JansensProducerApplication.class,args);
    }
}

4、自定義Banner

banner.txt

////////////////////////////////////////////////////////////////////  
//                          _ooOoo_                               //  
//                         o8888888o                              //  
//                         88" . "88                              //  
//                         (| ^_^ |)                              //  
//                         O\  =  /O                              //  
//                      ____/`---'\____                           //  
//                    .'  \\|     |//  `.                         //  
//                   /  \\|||  :  |||//  \                        //  
//                  /  _||||| -:- |||||-  \                       //  
//                  |   | \\\  -  /// |   |                       //  
//                  | \_|  ''\---/''  |   |                       //  
//                  \  .-\__  `-`  ___/-. /                       //  
//                ___`. .'  /--.--\  `. . ___                     //  
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //  
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //  
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //  
//      ========`-.____`-.___\_____/___.-`____.-'========         //  
//                           `=---='                              //  
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //  
//            佛祖保佑       上海研發     永無BUG                     //
////////////////////////////////////////////////////////////////////

5、新增控制器

HelloController.java

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello Jansens!";
    }
}

注意:為了模擬負載均衡,複製一份上面的專案取名為jansens-producer2,修改埠為8004,修改hello方法返回值為hello Jansens 2。依次啟動註冊中心、服務監控和兩個服務提供者。依次訪問http://localhost:8003/hello和http://localhost:8004/hello

二、服務消費者

1、新建一個專案jansens-consumer、新增依賴。

  • Swagger:API文件。
  • Consul:註冊中心。
  • Spring Boot Admin:服務監控。

pom.xml

<properties>
  <swagger.version>2.9.2</swagger.version>
  <spring.boot.admin.version>2.0.4</spring.boot.admin.version>
    </properties>
<!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <!--spring-boot-admin-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>${spring.boot.admin.version}</version>
        </dependency>
        <!--consul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

2、新增配置

application.yml

server:
  port: 8005
spring:
  application:
    name: jansens-consumer
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        serviceName: ${spring.application.name}    # 註冊到consul的服務名稱
  boot:
    admin:
      client:
        url: "http://localhost:8000"
# 開放健康檢查介面
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

3、啟動類

JansensConsumerApplication.java

@EnableDiscoveryClient
@SpringBootApplication
public class JansensConsumerApplication {

    public static void main(String[] args){
        SpringApplication.run(JansensConsumerApplication.class,args);
    }
}

4、服務消費

新增消費服務測試類,新增兩個介面,一個查詢所有我們註冊的服務,另一個從我們註冊的服務中選取一個服務,採取輪詢的方式。

ServiceController.java

@RestController
public class ServiceController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private DiscoveryClient discoveryClient;
    /**
     * 獲取所有服務
     */
    @RequestMapping("/services")
    public Object services() {
        return discoveryClient.getInstances("jansens-producer");
    }

    /**
     * 從所有服務中選擇一個服務(輪詢)
     */
    @RequestMapping("/discover")
    public Object discover() {
        return loadBalancerClient.choose("jansens-producer").getUri().toString();
    }
}

訪問http://localhost:8005/services、返回兩個服務,分別是註冊的8003、8004。反覆訪問http://localhost:8005/discover,結果交替的返回服務8003和8004,因為預設的負載均衡器採用的是輪詢的方式,兩個交替出現,從而實現了獲取服務端地址的均衡負載。

CallHelloController.java

@RestController
public class CallHelloController {

    @Autowired
    private LoadBalancerClient loadBalancer;

    @RequestMapping("/call")
    public String call() {
        ServiceInstance serviceInstance = loadBalancer.choose("jansens-producer");
        System.out.println("服務地址:" + serviceInstance.getUri());
        System.out.println("服務名稱:" + serviceInstance.getServiceId());

        String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
        System.out.println(callServiceResult);
        return callServiceResult;
    }

}

使用RestTemplate進行遠端呼叫。

5、負載均衡器(Ribbon)

修改啟動類注入RestTemplate並新增@LoadBalanced註解(用於攔截請求),以使用Ribbon來進行負載均衡。

JansensConsumerApplication.java

@Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }

6、新增服務

RibbonHelloController.java

@RestController
public class RibbonHelloController {

    @Autowired
    private RestTemplate restTemplate;
    
    @RequestMapping("/ribbon/call")
    public String call() {
        // 呼叫服務, service-producer為註冊的服務名稱,LoadBalancerInterceptor會攔截呼叫並根據服務名找到對應的服務
        String callServiceResult = restTemplate.getForObject("http://jansens-producer/hello", String.class);
        return callServiceResult;
    }
}

啟動消費者服務,訪問http://localhost:8005/ribbon/call

三、服務消費(Feign)

1、修改jansens-consumer的pom檔案,新增feign依賴

pom.xml

<!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

2、修改啟動類,新增@EnableFeignClients註解,開啟掃描Spring Cloud Feign客戶端的功能。

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class JansensConsumerApplication {

    public static void main(String[] args){
        SpringApplication.run(JansensConsumerApplication.class,args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}