繼spring cloud alibaba之nacos、feign服務注冊整合示例中我們再整合sentinel:因為hystrix不再更新且sentinel限流方式多樣可靠!
1、在spring cloud alibaba之nacos、feign服務注冊整合示例基礎上加入如下依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- sentinel持久化 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
其中我們需要将限流類配置持久化,否則sentinel-dashboad重新開機後配置就會丢失!
2、部署Sentinel-Dashboad
部署略!
下圖是限流資訊,注意不要在Sentinel-DashBoad端調整配置,雖然能生效,但重新開機後又會回到預設值,是以修改配置請在Nacos界面修改,這不得不吐糟下沒有做到雙向配置同步!
3、配置sentinel等相關資訊
上圖紅框是手動添加上去的,其餘都是使用http://start.aliyun.com自動生成的!
4、提供服務并設定限流
package com.songjy.spring.cloud.alibaba.demo.order.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @author songjy
* @date 2021-03-15
*/
@RestController
public class OrderController {
@GetMapping(value = {"/order/{id}"})
@SentinelResource(value = "getOrderId", fallback = "getOrderIdFallback")
public String getOrderId(@PathVariable("id") String id) {
return System.currentTimeMillis() + id;
}
public String getOrderIdFallback(String id) {
return "限流ERROR:" + id;
}
}
上述注解@SentinelResource就是限流配置,其中fallback就是限流後預設傳回值!
5、添加具體限流配置
每秒隻能同時允許95個請求!
6、消費端定義feign接口
package com.songjy.spring.cloud.alibaba.demo.user.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "spring-cloud-alibaba-demo-order")
public interface IOrderService {
@GetMapping(value = {"/order/{id}"})
String getOrderId(@PathVariable("id") String id);
}
另外,若果你不希望服務提供方提供fallback,你希望在服務消費方處理fallback,你可以實作該接口并指定fallback屬性,如下:
package com.songjy.spring.cloud.alibaba.demo.user.feign;
import org.springframework.stereotype.Component;
/**
* @author songjy
* @date 2021-03-15
*/
@Component
public class OrderServiceFallbackImpl implements IOrderService {
@Override
public String getOrderId(String id) {
return "異常:" + id;
}
}
消費方指定fallback,如下:
該方式隻要服務提供出現任何異常都可以降級處理!建議可以同時存在,雙管齊下,以防服務提供方全部當機!
7、限流測試調用
package com.songjy.spring.cloud.alibaba.demo.user;
import com.songjy.spring.cloud.alibaba.demo.user.feign.IOrderService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringCloudAlibabaDemoUserApplicationTests {
@Autowired
private IOrderService orderService;
@Test
void getOrderIdTest(){
for (int i = 0; i < 100; i++) {
String orderId = orderService.getOrderId("第" + (i + 1) + "次");
System.out.println(orderId);
}
}
}
執行結果:
可以看到,接口調用100次,最後5次被限流了,因為每秒隻允許95次! 那服務(spring-cloud-alibaba-demo-order)提供方啟動2個節點呢,會限流嗎?
srping-cloud-alibaba-nacos-feign-sentinel.zip
Sprinig Cloud Alibaba Seata分布式事物