目标:Sentinel的基本应用
工具:IDEA–2020.1、Sentinel Maven Nacos Sentinel SpringCloud
学习目标:学习Dubbo集成Sentinel并且接入Sentinel Dashboard
本次学习的工程请找博主索要
- 使用SpringCloud Hoxton.SR5版本
- 使用SpringCloudAlibaba 2.2.0.RELEASE版本
- 使用SpringBoot 2.2.7.RELEASE版本
- 使用java - JDK1.8版本
以下操作按照顺序即可操作成功
由于本博主想着要使用新的软件和最新的科技,让自己在开发的道路上不会OUT,我就尝试了一下使用最新的SpringCloud版本和Dubbo版本加上我们最新的SpringCloudAlibaba版本,以及我们的Sentinel版本。尝试过程过于头痛(也许因为我是小白吧)–哈哈哈。尝试出了一个没有问题的版本(目前我还没有遇到其他问题)。
Dubbo集成Sentinel限流
Sentinel提供了与Dubbo集成的适配模块–Sentinel Apache Dubbo Adapter,可以针对服务提供者和服务消费者进行流控,使用的时候需要添加一下依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
<version>1.7.1</version>
</dependency>
其他的没营养的不介绍了哈。
Dubbo服务接入Sentinel DashBoard
spring-cloud-starter-alibaba-sentinel目前无法支持Dubbo服务的限流,所以针对Dubbo服务的限流只能使用sentinel-apache-dubbo-adapter。这个适配组件并没有自动接入sentinel dashboard,所以需要通过以下步骤来进行接入。
-
引入sentinel-transport-simple-http依赖,这个依赖可以上报应用相关信息到控制台
我尝试将最新版本SpringCloudAlibaba引入并且将 com.alibaba.csp 相关包提升到1.7.2发现无法实例化Sentinel,所以我们还是只能使用Sentinel-1.7.1<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.7.1</version> </dependency>
知道如何添加依赖,没有代码的支撑不就是耍流氓吗?我们开始上Code
创建一个Maven工程,形成父子工程大家都懂的(父工程)
工程的springcloud版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
</properties>
这个里面需要我们管理相关的依赖管理。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
能学SpringCloud的都不是萌新,我们在里面首先创建一个sentinel-dubbo-api工程(子工程)
我们在里面定义一个接口
package com.xmaven;
public interface IHelloService {
String sayHello();
}
依赖不用添加什么原来的工程就行了(这也就是一个接口罢了)。
接下来就是我们服务提供者了(自己创建一个springboot工程)(我们典型的Dubbo架构)
添加相关依赖
<dependencies>
<!--springcloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--springcloud-alibaba dubbo依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--注入api接口依赖-->
<dependency>
<groupId>com.xmaven</groupId>
<artifactId>sentinel-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springcloud-alibaba nacos依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!--dubbo集成Sentinel实现限流-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
<version>1.7.1</version>
</dependency>
<!--dubbo服务接入Sentinel Dashboard-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.7.1</version>
</dependency>
<!--Dubbo接入资源管理依赖-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
配置我们的application.yml文件
spring:
application:
name: springcloud-sentinel-dubbo-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
dubbo:
scan:
base-packages: com.xmaven
protocol:
name: dubbo
port: 20880
registry:
address: spring-cloud://localhost
创建一个接口的实现类(也就是实现我们API工程中的接口)
@Service //先写注解才能实现我们的类
public class HelloServiceImpl implements IHelloService {
@Override
public String sayHello() {
return "背雷管的小青年!";
}
}
注意这个@Service是我们Dubbo的不是springboot的
新建一个NacosDataSourceInitFunc这个要实现我们这个InitFunc接口类
这里需要改造我们的Sentinel源码实现和Nacos持久化,这个请自行百度–谢谢!
//通过sentinel提供的InitFunc扩展点,实现Nacos数据源的配置
public class NacosDataSourceInitFunc implements InitFunc{
private String serverAddr="127.0.0.1:8848";
private String groupId="DEFAULT_GROUP";
private String dataId="springcloud.sentinel-dubbo.provider-sentinel-flow";
@Override
public void init() throws Exception {
loadNacosData();
}
private void loadNacosData(){
ReadableDataSource<String,List<FlowRule>> flowRuleDataSource=
new NacosDataSource<>(serverAddr, groupId, dataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}
重要的事情说三遍–我们后面会用到这个东西
记住这个dataId很重要
记住这个dataId很重要
记住这个dataId很重要
NacosDataSourceInitFunc要实现自动加载,需要在resource目录下的META-INF/services中创建一个名称为com.alibaba.csp.sentinel.init.InitFunc的文件,文件内容为com.xmaven.NacosDataSourceInitFunc
如图所示
还要在我们的这个启动类上打上我们的组件扫描
@ComponentScan("com.xmaven")
@SpringBootApplication
public class SentinelDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelDubboProviderApplication.class, args);
}
}
接下来配置我们的服务消费者(也是Springboot工程)
首先添加相关依赖
<!--springcloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--springcloud-alibaba nacos服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--注入api接口依赖-->
<dependency>
<groupId>com.xmaven</groupId>
<artifactId>sentinel-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建一个控制器
@RestController
public class HelloController {
@Reference
IHelloService helloService;
@GetMapping("/hello")
public String hello(){
return helloService.sayHello();
}
}
这个@Reference也是dubbo提供的
修改我们的application.yml文件
server:
port: 8888
spring:
application:
name: springcloud-sentinel-dubbo-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
dubbo:
scan:
base-packages: com.xmaven
配置完成启动运行测试一下
如何启动呢??
启动这个sentinel-dubbo-provider还需要添加一些参数信息
参数如下:(不懂请去Sentinel官方文档查看,本人已查阅,你呢?嘿嘿)
-Djava.net.perferIPv4Stack=true
-Dcsp.sentinel.api.port=8720
-Dcsp.sentinel.dashboard.server=localhost:7777
-Dproject.name=springcloud.sentinel-dubbo.provider
这个然后启动我们的sentinel-dubbo-consumer
成功如下:
注意启动之前,我们早就事先启动好了我们的Nacos(1.3.0)和Sentinel(1.7.2),均在本地启动
去到我们的Nacos控制台(成功效果如下)
这样就表示我们的服务注册到我们的服务注册中心Nacos了。
接下来演示我们的限流
我们这个控制器的路径是 http://localhost:8888/hello 多次访问
我们复制这个资源名字 com.xmaven.IHelloService:sayHello() 进行下图操作
如果实现了Nacos和Sentinel的持久化
那么Sentinel的规则就会持久化到Nacos中
快速访问我们的 http://localhost:8888/hello
很容易看见限流措施
[scode type=“green”]如需代码请联系博主![/scode]
评论区