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說明呼叫成功!