1. 程式人生 > >Spring Cloud -- 消費者 (Feign、Ribbon 搭建)

Spring Cloud -- 消費者 (Feign、Ribbon 搭建)

作為微服務框架,SpringCloud 將各個 業務拆分成 獨立執行的模組。那各個模組之間是怎樣通訊的呢?SpringCloud 提供兩種方法:1.Ribbon+RestTemplate  2.openFeign

一、客戶端負載均衡:Spring Cloud Ribbon。

Spring Cloud Ribbon是基於HTTP和TCP的客戶端負載工具,它是基於Netflix Ribbon實現的。通過Spring Cloud的封裝,可以輕鬆地將面向服務的REST模板請求,自動轉換成客戶端負載均衡服務呼叫。

1、 Ribbion+RestTemplate方式

       使用IntelliJIdea建立一個消費者工程, New Project ---> 選中Spring Initializr ---> 設定包名/工程名 ---> 勾選Web、Eureka Discovery、Ribbon等 ---> 設定儲存路徑。

修改配置檔案application.properties

#埠
server.port=11000
#註冊地址
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
#服務名稱
spring.application.name=ribbon

在入口類新增@EnableEurekaClient,@LoadBalanced,@Bean

package com.springcloud.ribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * 本例中使用Eureka服務中心所以用@EnableEurekaClient
 * 如果註冊中心是zookeeper或其它,建議使用@EnableDiscoveryClient
 **/
@SpringBootApplication
@EnableEurekaClient
public class RibbonApplication {

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

    //宣告RestTemplate並新增@Bean和@LoadBalanced, @LoadBalance表示支援Ribbon的負載均衡。
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

 新建service 和controller ,結構如下:

 Helloservice:

package com.springcloud.ribbon.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * Created by joe強 on 2018/9/27 20:01
 */
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;
    public String doSomething(String parm){
        String result;
        result=restTemplate.getForObject("http://server1/ribbon?parm="+parm,String.class);//呼叫server1客戶端 ribbon介面
        System.out.println(result);
        return  result;
    }
}

ConsumerController:

package com.springcloud.ribbon.controller;

import com.springcloud.ribbon.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by joe強 on 2018/9/27 20:15
 */
@RestController
public class ConsumerController {
    @Autowired
    HelloService helloService;

    @RequestMapping(value = "/consumer",method = RequestMethod.GET)
    public String callRemoteService(@RequestParam String parm){
        String str= helloService.doSomething(parm);
        return "你呼叫了server1的API,結果是"+str;
    }
}

 

啟動 Eureka服務註冊中心,server1客戶端,Zuul 閘道器,ribbon服務 。

訪問 http://localhost:8080

服務啟動之後 呼叫介面:

便於觀察 先用 Zuul 閘道器 呼叫server1服務的介面

 再 用Ribbon 服務 呼叫 server1 的ribbon 介面

同樣返回的是server1 的埠號,說明呼叫成功!

二、OpenFeign 方式

       建立一個Feign服務, 呼叫service-hello1服務的介面。New Project ---> 選中Spring Initializr ---> 設定包名/工程名 ---> 勾選Web、Eureka Discovery、Feign等 ---> 設定儲存路徑。

修改配置檔案,這裡使用的是.properties 而不是yml, 兩種都可以,選其中一個

#閘道器埠
server.port=12000
#服務名稱
spring.application.name=Feign
#註冊地址
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/

在 入口類中增加註解@EnableEurekaClient @EnableFeignClients

package com.springcloud.feign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient //表示自己是服務註冊中心客戶端
@EnableFeignClients //使用Feign呼叫其他服務介面的客戶端
public class FeignApplication {

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

新增Service介面和Controller類,包結構如下:

Server1Service:

package com.springcloud.feign.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Created by joe強 on 2018/9/27 20:57
 */
@FeignClient(value = "server1")  //微服務server1客戶端
public interface Server1Service {
    @RequestMapping(value = "/ribbon") //和需要呼叫介面的訪問url一樣
    String callribbonByFegin(@RequestParam(value = "parm")String parm);//呼叫微服務server1的介面ribbon
}

 FeignController:

package com.springcloud.feign.controller;

import com.springcloud.feign.service.Server1Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by joe強 on 2018/9/27 21:02
 */
@RestController
public class FeignController {
    @Autowired
    Server1Service server1Service; //呼叫外部服務介面
    @RequestMapping(value = "/hello")
    public String sayHello(@RequestParam(value = "parm")String parm){
        System.out.println("---------"+parm+"---------");
        return server1Service.callribbonByFegin(parm);  //呼叫server1 服務的ribbon 介面

    }
    @RequestMapping(value = "/first")
    public String doFirst(){
        return "this is server1FeignDemo";
    }

}

啟動 Feign服務:

使用Feign 呼叫 server1 介面:

 

返回埠號8081說明呼叫成功!