1 本地負載均衡器基本概念
2,本地負載均衡器與nginx的區別
3,利用openfeign客戶端實現rpc調用
4,Ribbon實現客戶端負載均衡器源碼解讀
本地負載均衡器:
什麼是本地負載均衡器: 我們的消費者從我們的註冊中心上獲取接口調用地址列表,本地實現負載均衡算法(輪詢,隨機,hash一致,權重)等原理,獲取接口的列表,採用算法獲取選擇一個接口地址實現本地的rpc遠程調用。
本地負載均衡器有: 自己寫基於httpclient客戶端,ribbon SpringCloud 第一代中,
loadbalancerSpringCloud 自己研發。
如何選擇 ribbon 還是loadbalancer
SpringCloud Rest 或者Openfeign 都是默認支持ribbon
本地負載均衡器與nginx實現負載均衡器有哪些區別呢?
Nginx 屬於服務器負載均衡器,客戶端所有的請求都是統一交給我們的nginx,再由我們的nginx轉發到我們的真實服務實現負載均衡。
本地負載均衡器: 屬於客戶端負載均衡
Nginx實現負載均衡與本地實現負載均衡器應用場景。
Nginx 實現對我們的服務器實現負載均衡器 一般用於tomcat、jetty服務器。
本地負載均衡器屬於客戶端負載均衡器,一般用於微服務rpc遠程調用 比如dubbo,rest模板,openfeign 或者rpc遠程調用框架。
SpringCloud rest 或者openfeign 客戶端默認都是ribbon 實現調用。
@loadbalancer 實際上是我們的springcloud 自己寫的
loadBlancerClientSpringCloud 根據服務id 獲取id獲取負載均衡器rpc地址。
Openfeign 客戶端:
SpringCloud 第一代採用feign 第二代採用openfeign
openfeign 客戶端作用: 是一個web聲明式的http客戶端遠程調用工具。,底層是封裝HttpClient 技術。
Openfeign 屬於Springcloud自己研發,而feign是netflix 代碼寫法幾乎沒有任何變化。
真正的一個微服務架構 項目架構模式:
mayikt-meite-openfeign-parent---整個依賴父類
-----mayikt-service-api---開放的api接口 定義了接口沒有任何代碼業務實現。
--------mayikt-service-api-member---會員提供開放接口
--------mayikt-service-api-order---訂單提供開放接口
-----mayikt-service-impl---對我們開放的api接口代碼實現
--------mayikt-service-impl-member---會員提供開放接口
--------mayikt-service-impl-order---訂單提供開放接口
微服務構建基本的樣式,最大的優點是能夠對我們feign 實現複用機制。
注意feign客戶端調用的事項: 如果請求參數沒有加上註解的話,默認採用post請求發送
Openfeign 默認支持負載均衡, ribbon
nacos 服務註冊 服務名稱是否 有下劃線
在微服務架構中服務的名稱不能有下劃線。
Maven依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<!-- springboot 整合web組件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
會員服務接口
public interface MemberService {
/**
* 提供會員接口
*
* @param userId
* @return
*/
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Long userId);
}
@RestController
public class MemberServiceImpl implements MemberService {
@Value("${server.port}")
private String serverPort;
@Override
public String getUser(Long userId) {
return "我是會員服務端口號爲:" + serverPort;
}
}
訂單服務
@RestController
public class OrderService {
@Autowired
private MemberServiceFeign memberServiceFeign;
/**
* 訂單調用會員
*
* @return
*/
@GetMapping("/orderToMember")
public String orderToMember() {
String result = memberServiceFeign.getUser(10L);
return "我是訂單服務,調用會員服務接口返回結果:" + result;
}
}
@FeignClient(name = "meitemayikt-member")
public interface MemberServiceFeign extends MemberService {
// /**
// * 提供會員接口
// *
// * @param userId
// * @return
// */
// @GetMapping("/getUser")
// String getUser(@RequestParam("userId") Long userId);
}
微服務架構基本的樣式 最大的優點能夠對我們feign實現複用機制。
注意feign客戶端調用的事項:如果請求參數沒有加上註解的話,默認採用post請求發送。
Openfeign默認是支持負載均衡,ribbon。