需求项目结构图Sentinel控制台准备nacos准备根模块内容
pom.xml consumer
pom.xmlbootstrap.ymlRemoteServiceRemoteServiceFallbackConsumerController启动程序 Provider
pom.xmlbootstrap.ymlProviderController启动程序 测试 需求
使用nacos进行服务的注册与发现
使用openfeign进行服务间的调用
使用sentinel进行消费者服务的流量控制
大体逻辑:
两个服务,一个comsumer,一个provider,浏览器访问consumer的/echo地址,consumer内部通过feign访问provider的/echo拿到处理结果,返回给浏览器同时定义一个流量超过限制的/echo 项目结构图 Sentinel控制台准备
到github release下载sentinel dashboard 的jar包,在自己电脑cmd启动起来然后最小化即可
java -Dserver.port=8718 -jar sentinel-dashboard-1.8.0.jar
nacos准备网上搜一下吧,云服务器记得开8848,9848,9849端口
根模块内容 pom.xmlspring boot 2.3.3.RELEASEspring-cloud-dependencies Hoxton.SR9spring-cloud-alibaba-dependencies 2.2.6.RELEASE
注意boot于cloud的版本兼容问题,不然会报错Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in class path resourcedependencies是要写在dependencyManagement里的,而不是dependencies里,dependencyManagement的作用是版本管理,它下面的不会被maven自动导入,在根模块添加了这个dependencyManagement,子模块里使用它下面的包时,就不用管它的版本了,可以观察consumer和provider的pom文件 consumer pom.xml
spring-cloud-starter-openfeign是由spring-cloud-dependencies进行版本管理的,下面nacos注册和sentinel的版本由spring-cloud-alibaba-dependencies管理
bootstrap.yml注意不能是application.yml
server: port: 9200spring: application: # 应用名称 name: nacos-consumer cloud: nacos: discovery: # 服务注册地址 server-addr: nacos服务器IP:8848 sentinel: transport: dashboard: localhost:8718feign: sentinel: enabled: true
到时候就直接访问localhost:9200就是consumer
RemoteService@FeignClient(value = "nacos-provider", fallback = RemoteServiceFallback.class)public interface RemoteService{ @GetMapping(value = "/echo") String echo();}
RemoteServiceFallback用在上面@FeignClient的fallback中,当sentinel发现流量超过后面自己设置的流控规则后,就会让feign走这个fallback
@Servicepublic class RemoteServiceFallback implements RemoteService{ @Override public String echo() { return "系统繁忙,请稍后"; }}
ConsumerController@RestControllerpublic class ConsumerController{ @Resource private RemoteService remoteService; @GetMapping(value = "/echo") public String echo() { return remoteService.echo(); }}
启动程序加两个注解
//使用注册中心@EnableDiscoveryClient//获取注册中心的接口@EnableFeignClients
Provider pom.xmlserver: port: 9201spring: application: # 应用名称 name: nacos-provider cloud: nacos: discovery: # 服务注册地址 server-addr: nacos服务器IP:8848
ProviderController@RestControllerpublic class ProviderController{ @GetMapping("/echo") public String echo() { System.out.println("有一个请求"); return "来自Provider Demo"; }}
启动程序@EnableDiscoveryClient
测试 localhost:9200/echo疯狂刷新,每次都得到http://localhost:8718,账号密码sentinel,看到通过QPS,没有拒绝QPS添加流控规则,注意资源名为GET:http://nacos-provider/echo,修改一个阈值为2保存即可然后再回去狂刷新,就会看到有时提示实时监控也监控到了