继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分布式事物