一、整合sentinel
1、下载并启动sentinel
启动命令(默认是8080端口,因此修改端口号为8070)
java -Dserver.port=8070 -Dcsp.sentinel.dashboard.server=localhost:8070 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
2、引入依赖
<!--整合sentinel--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.1.0.RELEASE</version></dependency>
3、application.yaml增加sentinel配置
spring:cloud:sentinel:transport:dashboard: localhost:8070
4、重启微服务,并发起一些请求
二、利用sentinel实现请求的限流
2.1、流控
2.1.1、qps和并发线程数的区别
并发线程数:表示web请求进来服务器,tomcat开启几个线程来处理这些web请求。
qps:单位时间内,请求接口次数限制。
2.2、fallback
2.2.1、添加依赖
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency>
2.2.2、application.yaml配置
feign:okhttp:enabled: truesentinel:enabled: true
2.2.3、写FallbackFactory接口的实现类
java">package com.niuniu.user.feignclient.fallback;import com.niuniu.user.feignclient.OrderClient;
import com.niuniu.user.model.Order;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;import java.util.Collections;
import java.util.List;@Slf4j
public class OrderClientFallBackFactory implements FallbackFactory<OrderClient> {@Overridepublic OrderClient create(Throwable throwable) {log.error("OrderClient error!", throwable);return new OrderClient() {@Overridepublic List<Order> getOrdersByUserId(Long userId) {return Collections.emptyList();}};}
}
2.2.4、生成上一步实现类的对象
java">package com.niuniu.user.config;import com.niuniu.user.feignclient.fallback.OrderClientFallBackFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FallBackConfig {@Beanpublic OrderClientFallBackFactory orderClientFallBackFactory() {return new OrderClientFallBackFactory();}
}
2.2.5、feignclient接口增加fallbackFactory = OrderClientFallBackFactory.class
java">package com.niuniu.user.feignclient;import com.niuniu.common.config.DefaultFeignConfig;
import com.niuniu.user.feignclient.fallback.OrderClientFallBackFactory;
import com.niuniu.user.model.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@Component
@FeignClient(value = "order-service", configuration = DefaultFeignConfig.class, fallbackFactory = OrderClientFallBackFactory.class)
public interface OrderClient {@GetMapping(value = "/order-service/order/getOrdersByUserId")List<Order> getOrdersByUserId(@RequestParam("userId") Long userId);
}
2.2.6、测试
修改变调用微服务的代码
java">/*** 根据用户查询订单* @param userId* @return*/@GetMapping("/getOrdersByUserId")public List<Order> getOrdersByUserId(@RequestParam(name = "userId") Long userId){log.info(UserContext.getUser().toString());int i = 1;System.out.println(i / 0);return orderMapper.getByUserId(userId);}