前面我們通過兩篇文章介紹了一下spring cloud ribbon實現負載均衡
- SpringCloud Ribbon負載均衡的集成引入
- SpringCloud Ribbon負載均衡的實現及自定義負載均衡
今天主要給大家介紹一下負載均衡的另一種實現方式,廢話不多說,開始今天的內容。
1)Feign 簡介
feign是聲明式的web service客戶端,它使微服務之間的調用更加簡單,就像傳統ssm框架中controller調用service一樣,SpringCloud集成了Eureka和Ribbon,可在使用Feign時提供負載均衡的http客戶端。
只需要創建一個接口,添加註解即可
調用微服務的方式:
- 通過微服務名稱調用【ribbon】
- 通過接口和註解調用【feign】
2)Feign 的原理
- 啓動時掃描所有包下所有
@FeignClient
註解的類,並將這些類注入到spring的IOC容器中。當定義的Feign中的接口被調用時,通過JDK的動態代理來生成RequestTemplate
。 RequestTemplate
中包含請求的所有信息,如請求參數,請求URLRequestTemplate
生成Request
,然後將Request
交給client處理- 最後client封裝成
LoadBaLanceClient
,結合ribbon負載均衡地發起調用
3)Feign的集成實現
- 引入依賴,修改pom.xml
<!-- Feign依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
- 創建Feign接口
@Component
@FeignClient(value = "pro_user") //value:微服務名稱
public interface IUserService {
@GetMapping("/api/user/add")
public boolean addUser(User user);
@GetMapping("/api/user/query/{id}")
public User queryUserById(@PathVariable("id")Long id);
@GetMapping("/api/user/query")
public List<User> queryUserList();
}
- 消費者調用
-`@RestController
public class UserController {
@Qualifier("IUserService")
@Autowired
private IUserService userService = null;
@RequestMapping("/con/user/{id}")
public User getser(@PathVariable("id") long id){
return this.userService.queryUserById(id);
}
@RequestMapping("/con/user/save")
public boolean saveUser(String username,String pass){
User u = new User();
u.setUsername(username).setPass(pass);
return this.userService.addUser(u);
}
@RequestMapping("/query")
public List<User> queryAllUser(){
return this.userService.queryUserList();
}
}`
- 修改啓動類,添加Feign
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.fyy"})
public class FeignConApplication {
public static void main(String[] args) {
SpringApplication.run(FeignConApplication.class,args);
}
}
至此我們就完成了Feign的集成配置,是不是感覺更像我們平常開發中使用的方式呢。這就是Feign的特點
4)FeignClient註解的一些屬性
屬性名 | 默認值 | 作用 | 備註 |
---|---|---|---|
value | 調用服務名稱與name屬性相同 | ||
serviceId | 調用服務ID | 已過期 | |
name | 調用服務名稱與value屬性相同 | ||
url | 全路徑地址或hostname,http或https可選 | ||
decode404 | false | 配置響應狀態碼爲404時是否應該拋出FeignExceptions | |
configuration | {} | 自定義當前feign client的一些配置 | 參考FeignClientsConfiguration |
fallback | void.class | 熔斷機制,調用失敗時,走的一些回退方法,可以用來拋出異常或給出默認返回數據 | 底層依賴hystrix,啓動類要加上@EnableHystrix |
path | 自動給所有方法的requestMapping前加上前綴,類似與controller類上的requestMapping | ||
primary | true |
5)Feign配置詳解
feign:
client:
config:
default:
connectTimeout: 5000 #連接時間
readTimeout: 5000 #讀時
loggerLevel: basic #日誌
okhttp:
enabled: true #開啓OKhttp來發送請求,默認是使用jdk中的HttpURLConnection發送HTTP請求
hystrix:
enabled: true #開啓熔斷機制,調用失敗時,走的一些回退方法
compression:
request: #請求
enabled: true #開啓
mime-types: text/xml,application/xml,application/json #開啓支持壓縮的MIME TYPE
min-request-size: 2048 #配置壓縮數據大小的下限
response: #響應
enabled: true #開啓響應GZIP壓縮
由於開啓GZIP壓縮之後,Feign之間的調用數據通過二進制協議進行傳輸,返回值需要修改爲ResponseEntity<byte[]>纔可以正常顯示,否則會導致服務之間的調用亂碼