侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 93 篇文章
  • 累计创建 110 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

Dubbo集成Sentinel并且接入Sentinel Dashboard

Epoch
2020-06-18 / 0 评论 / 0 点赞 / 295 阅读 / 2,390 字 / 正在检测是否收录...

目标:Sentinel的基本应用
工具:IDEA–2020.1、Sentinel Maven Nacos Sentinel SpringCloud
学习目标:学习Dubbo集成Sentinel并且接入Sentinel Dashboard
本次学习的工程请找博主索要

  1. 使用SpringCloud Hoxton.SR5版本
  2. 使用SpringCloudAlibaba 2.2.0.RELEASE版本
  3. 使用SpringBoot 2.2.7.RELEASE版本
  4. 使用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

如图所示
`U4(2UP}YXV%_K.png

还要在我们的这个启动类上打上我们的组件扫描

@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还需要添加一些参数信息
DXJ-JJQ85-SGSV40-ZF.png

参数如下:(不懂请去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

成功如下:
BEC-R-ZKKM-7TS_-P-WQ_W.png

注意启动之前,我们早就事先启动好了我们的Nacos(1.3.0)和Sentinel(1.7.2),均在本地启动
YU-A-51I5RZDXZ85W-Q-L.png

去到我们的Nacos控制台(成功效果如下)
JO6E-O-G-AC-M_JPS-C-5W.png

这样就表示我们的服务注册到我们的服务注册中心Nacos了。

接下来演示我们的限流

我们这个控制器的路径是 http://localhost:8888/hello 多次访问

H)4MWSA9$KXTB{O0G(5CG.png

95-65F50S-6XGC1-UPU-0.png

我们复制这个资源名字 com.xmaven.IHelloService:sayHello() 进行下图操作

1D-CKQ2-S-FWE_D-0.png

如果实现了Nacos和Sentinel的持久化
那么Sentinel的规则就会持久化到Nacos中
1XIFF5U5ZV7W-WE-GO-LB.png

快速访问我们的 http://localhost:8888/hello
很容易看见限流措施

D1IIDPV@`0EUJM7ED@G94F5.png

[scode type=“green”]如需代码请联系博主![/scode]

0

评论区