阅读 465

sentinel配置持久化到nacos与sentinel集成

部署sentinel控制台

  1. 拉取sentinel代码,自己修改后增加nacos持久化https://github.com/hcq0514/Sentinel 注意可自行使用master分支,未修改可正常运行,my分支是修改完的
  2. 进入到dashboard项目中,使用如下命令将代码打包成一个 sentinel-dashboard.jar
mvn clean package

3.将jar包打包成docker镜像

  • Dockerfile
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD sentinel-dashboard.jar /sentinel-dashboard.jar
# 声明服务运行端口
EXPOSE 8885
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/sentinel-dashboard.jar"]
# 指定维护者的名字
MAINTAINER hcq
  • run.sh
#!/usr/bin/env bash
# 定义应用组名
group_name='mall'
# 定义应用名称
app_name='sentinel2'
# 定义应用版本
app_version='1.0-SNAPSHOT'
# 定义应用环境
profile_active='test'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8885:8885 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-e Dserver.port="8885" \
-e Dcsp.sentinel.dashboard.server="8885" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
  • 运行. run.sh
  1. 登录控制台查看
    http://xxx:8885/#/login

网关集成 (部署的应用不管是网关还是项目都需要与sentinel的控制台发送心跳,需要ip等,尽量都使用云服务器等访问的到的主机,用本地有可能会导致链接不到,无法展示请求链路等其他信息)

  1. 网关层添加依赖(这边只添加与sentinel有关的依赖,其他组件不展示)
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.0</version>
        </dependency>
  1. 增加配置文件
    如果用docker部署的话记得在dockerFile里面指定project.name这个是客户端注册到控制台的名称
示例文件
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD mall-portal-1.0-SNAPSHOT.jar /mall-portal-1.0-SNAPSHOT.jar
# 声明服务运行在8085端口
EXPOSE 8085
# 指定docker容器启动时运行jar包
ENV JAVA_OPTS="\
-Xmx1g \
-Xms1g \
-Xmn512m \
-XX:SurvivorRatio=8 \
-XX:MetaspaceSize=256m "
ENTRYPOINT java ${JAVA_OPTS}  -Dproject.name=mall-portal-service -jar mall-portal-1.0-SNAPSHOT.jar

application.pro

spring:
  main:
    allow-bean-definition-overriding: true
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8885 #部署的dashboard地址
        client-ip: localhost #本机的访问ip
        port: 8720 #与sentinel交互心跳信息的端口(docker部署项目一点要开启这个端口,每个项目都不一样)
      datasource:
        # 名称随意,这些是dashboard做持久化后添加规则,会在nacos的配置文件中生成该配置(没用可不添加)
        flow:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: flow
        degrade:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade
        system:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-system-rules
            groupId: SENTINEL_GROUP
            rule-type: system
        authority:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-authority-rules
            groupId: SENTINEL_GROUP
            rule-type: authority
        param-flow:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-param-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: param-flow
      eager: true

MVC项目集成

  1. 添加依赖(因为此处有版本冲突,则自己制定版本号)
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.3.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.csp</groupId>
                    <artifactId>sentinel-spring-webmvc-adapter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-webmvc-adapter</artifactId>
            <version>1.8.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.0</version>
        </dependency>
  1. 增加配置文件(与网关相同,这边不重复)

open feign集成(默认已导入springcloud与openFeign包)

  1. 开启sentinel feign配置
feign:
  sentinel:
    enabled: true
  1. 在feign客户端上添加处理函数就行(也可添加fallback,不过就不能取到异常)
@FeignClient(value = "mall-member-service", fallbackFactory = MemberFeignClientFallbackFactory.class)

@Component
@Slf4j
public class MemberFeignClientFallbackFactory implements FallbackFactory<MemberFeignClient> {

    @Override
    public MemberFeignClient create(Throwable throwable) {
        log.error("fallback reason:{}", throwable.getMessage());
        return new MemberFeignClient() {
            @Override
            public CommonResult<String> getMemberTest() {
                String info = "该链接发生异常,请稍后重试";
                if (throwable instanceof FlowException) {
                    info = "该链接已流控,请稍后重试";
                } else if (throwable instanceof DegradeException) {
                    info = "该链接已降级,请稍后重试";
                } else {
                    info = "该链接发生异常,请稍后重试";
                }
                Asserts.fail(info + throwable.getMessage());
                return null;
//                return CommonResult.failed(info + throwable.getMessage());
            }
        };
    }
}

到这边基础的集成已经完成


如果正常的话在sentinel的机器列表可以看到有注册信息

sentinel配置持久化到nacos

  1. 把官方源码拉下来
  2. 将sentinel-dashboard的pom文件中把范围test注释掉
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
<!--            <scope>test</scope>-->
        </dependency>
  1. 将示例文件拷贝到dashboard里面(这里面有3种框架的集成方法)



    把 nacosConfig里面的nacos地址修改为自己的nacos地址

@Bean
    public ConfigService nacosConfigService() throws Exception {
        return ConfigFactory.createConfigService("your nacos address");
    }
  1. 修改controller的方法让它直接推到nacos(以FlowControllerV1 限流controller为例)
    添加依赖
    @Autowired
    private FlowRuleNacosPublisher flowRuleNacosPublisher;
    @Autowired
    private FlowRuleNacosProvider flowRuleNacosProvider;

    将所有sentinelApiClient.fetchFlowRuleOfMachine(app, ip, port);
    调用的地方都改成 flowRuleNacosProvider.getRules(app)

    将所有sentinelApiClient.setFlowRuleOfMachineAsync(app, ip, port, rules);
    调用的地方都改成  flowRuleNacosPublisher.publish(app, rules);
  1. 修改其他的controller
  2. 可直接参考我sentinel下面的my分支,已经实现了持久化

作者:hcq0514

原文链接:https://www.jianshu.com/p/9c5ad75ddfa5

文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐