前言
本文是根據螞蟻課堂余勝軍老師的課程所做筆記,記錄的要點,部分自己的理解可能有所偏差,不當之處會進行修改。
本地負載均衡器
本地負載均衡器負責從注冊中心上獲取接口調用地址列表,本地實現負載均衡算法。
原理:獲取接口地址列表,采用算法獲取一個接口地址實現本地rpc遠程調用。
本地負載均衡器與Nginx實現負載均衡器的區別
Nginx屬於服務器負載均衡器,客戶端所有的請求都統一交給Nginx,再由Nginx轉發到真實服務實現負載均衡。
本地負載均衡器:屬於客戶端負載均衡。
應用場景:
- Nginx實現對服務器的負載均衡,一般用於tomcat/jetty服務器
- 本地負載均衡器屬於客戶端負載均衡器,一般用於微服務rpc遠程調用,比如dubbo、openfeign等。
LoadBalanced結合Rest
@GetMapping("/orderRibbonToMember")
public Object orderRibbonToMember() {
//通過服務地址加上方法名調用,String.class為方法返回值類型
String object = restTemplate.getForObject("http://member-nacos/user", String.class);
return "調用返回結果"+object;
}
restTemplate通過服務名來訪問,restTemplate上要加上@LoadBalanced注解來實現負載均衡,底層使用的是ribbon。自動完成了通過服務名獲取調用地址列表,並選擇一個進行調用的功能。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
使用LoadBalancerClient實現負載
LoadBalancerClient已經注冊,可直接注入使用
@GetMapping("/orderLoadBalancerClient")
public Object orderLoadBalancerClient() {
//根據服務名通過負載均衡算法獲得服務實例
ServiceInstance choose = loadBalancerClient.choose("member-nacos");
return choose;
}
Openfeign客戶端
SpringCloud第一代采用的是feign,第二代采用openfeign。
Openfeign客戶端是一個Web聲明式的Http客戶端遠程調用工具,底層封裝了HttpClient技術。
feign是netflix研發,而openfeign是SpringCloud自己研發的,但在使用上的代碼寫法幾乎是一致的。
在項目本地創建一個對應於要遠程調用的服務的接口,然后使用@FeignClient注解。注意,要使用@EnableFeignClients開啟openfeign
導入openfeign的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
在service-api-member模塊下有一個供調用的服務接口
public interface MemberService {
@GetMapping("/user")
String getUser();
}
在service-impl-member模塊下實現上面的接口。(接口方法的注解會被實現類的方法繼承)
@RestController
public class MemberServiceImpl implements MemberService {
@Override
public String getUser() {
return "會員服務調用";
}
}
我們要在service-order模塊中調用MemberService的實現方法。
MemberService的實現模塊的服務名為member-service。在service-order中創建接口對應於MemberService,使用@FeignClient根據服務名可獲取調用地址並且已經實現了負載均衡。
@FeignClient("member-service")
public interface MemberServiceFeign {
@GetMapping("/user")
String getUser();
}
這樣我們在service-order里使用MemberServiceFeign接口中的方法就可以調用MemberService的實現類的方法。
@RestController
public class OrderService {
@Autowired
private MemberServiceFeign memberServiceFeign;
@GetMapping("orderFeignToMember")
public String orderFeignToMember() {
String user = memberServiceFeign.getUser();
return user;
}
}
注意feign客戶端調用的事項:如果請求參數沒有加上注解的話,默認采用post請求
Nacso服務注冊 服務名稱命名不能有下划線,feign獲取服務時,服務名有下划線會報錯。