首页 > 其他分享 >Sentinel整合Apollo进行规则持久化(二)

Sentinel整合Apollo进行规则持久化(二)

时间:2023-06-02 21:04:11浏览次数:44  
标签:Apollo 持久 配置 sentinel Sentinel import apollo


  【Sentinel整合Apollo进行规则持久化对Sentinel的代码进行了改造,【Apollo配置中心管理后台的详解】对Apollo管理后台进行了讲解。今天就最终实现:Sentinel整合Apollo进行规则持久化

 

0x01:先把Apollo配置中心启动

主要启动如下三个服务:

apollo-configservice:提供配置获取接口,提供配置更新推送接口,接口服务对象为Apollo客户端

apollo-adminservice:提供配置管理接口,提供配置修改、发布等接口,接口服务对象为Portal,以及Eureka

apollo-portal:提供Web界面供用户管理配置

Sentinel整合Apollo进行规则持久化(二)_spring

 

0x02:sentinel-dashboard代码改动

  【Sentinel整合Apollo进行规则持久化整体只是把相关代码移动了一些位置,现在还需做些许改动。

配置类设置参数

Sentinel整合Apollo进行规则持久化(二)_spring_02

根据实际情况修改Apollo管理后台地址和开发平台授权token

Sentinel整合Apollo进行规则持久化(二)_ci_03

Apollo管理后台地址

 

Sentinel整合Apollo进行规则持久化(二)_ci_04

token

FlowRuleApolloProvider修改

Sentinel整合Apollo进行规则持久化(二)_spring_05

FlowRuleApolloPublisher修改:

Sentinel整合Apollo进行规则持久化(二)_maven_06

备注:这里要注意如果使用ApolloConfigUtil.getFlowDataId()方法获取flowDataId,则在Apollo配置中心需要按照约定建立配置项的Key。

改造完成后,并可以启动sentinel-dashboard

 

0x03:Apollo配置中心添加配置

添加配置并发布

Sentinel整合Apollo进行规则持久化(二)_ci_07

源码

flowRules = [{"app":"pay-service","clusterMode":false,"controlBehavior":0,"count":300,"gmtModified":1596855658214,"grade":1,"id":1,"limitApp":"default","resource":"/getUser","strategy":0}]
degrades = [{"resource": "/getUser","count": 50,"timeWindow": 5,"grade": 0},{"resource": "/getUser","count": 5,"timeWindow": 8,"grade": 2},{"resource": "/erro","count": 0.5,"timeWindow": 5,"grade": 1}]
authoritys = [{"resource": "/getUser","limitApp": "192.168.12.215","strategy": 1}]
paramflows = [{"resource": "/getUser","grade": 1,"paramIdx": 1,"count": 10,"paramFlowItemList": []}]
systems = [{"qps": 20}]

0x04:微服务改造

  • 新建项目olive-apollo-sentinel-datasource,对应的pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sentinel</groupId>
    <artifactId>olive-apollo-sentinel-datasource</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <name>olive-nacos-sentinel-datasource</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

          <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-apollo</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE </version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
  • 修改配置文件
server:
  port: 8866

spring:
  application:
    name: pay-service #olive-apollo-sentinel-datasource
  cloud:
    sentinel:
      transport:
        port: 8719 # 向sentinel-dashboard传输数据的端口 默认:8719
        dashboard: 127.0.0.1:8081 # sentinel-dashboard
      log:
        dir: ./logs # 默认值${home}/logs/csp/
        switch-pid: true # 日志带上线程id
      datasource:
        flow: # 流控规则
          apollo:
            namespaceName: application
            flowRulesKey: flowRules
            rule-type: flow #flow,degrade,authority,system, param-flow
        degrade: # 熔断降级规则
          apollo:
            namespaceName: application
            flowRulesKey: degrades
            rule-type: degrade
        authority: # 授权规则  未验证,官方不推荐
          apollo:
            namespaceName: application
            flowRulesKey: authoritys
            rule-type: authority
        system: # 系统规则
          apollo:
            namespaceName: application
            flowRulesKey: systems
            rule-type: system
        param-flow: # 热点规则
          apollo:
            namespaceName: application
            flowRulesKey: paramflows
            rule-type: param-flow
app:
  id: payservice # 指定规则项目在 apollo 的app.id,要与 sentinel 控制台启动参数一致
apollo:
  bootstrap:
    enabled: true # 开启 apollo
    namespaces: application
  meta: http://192.168.56.1:8080
  cacheDir: ./apolloconfig  # 缓存文件位置
  • 备注:注意这里的flowRuleKey的值,需要跟Apollo配置中心配置的Key一致,同时跟Sentinel中FlowRuleApolloProvider和FlowRuleApolloProvider类定义的flowDataId一致。另外,apollo.mata配置项的值为配置中心Eureka的地址
  • 新建控制器
package com.olive.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/getUser")
    public Map<String, Object> getUser() {
        Map<String, Object> result = new HashMap<>();
        result.put("code", "000000");
        result.put("message", "ok");
        return result;
    }
}
  • 新建SpringBoot启动类
package com.olive;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
  • 启动微服务

 

0x05:测试验证

  • 访问接口
http://localhost:8866/getUser

Sentinel整合Apollo进行规则持久化(二)_ci_08

  • 访问Sentinel

Sentinel整合Apollo进行规则持久化(二)_maven_09

备注:可以通过修改相关配置来验证,Apollo和Sentinel是否相互同步,即在Apollo修改后,是否Sentinel能获取最新配置;或者在Sentinel修改后,是否Apollo能获取最新配置。

最后,这里只改造了流控规则,其他规则的改造与以上改造一致

标签:Apollo,持久,配置,sentinel,Sentinel,import,apollo
From: https://blog.51cto.com/u_13538361/6404932

相关文章

  • Sentinel规则Pull模式持久化
    阅读文本大概需要3分钟。   前一篇【使用Nacos存储Sentinel的限流规则】讲了基于Nacos的Push模式持久化,这里讲下基于本地文件的Pull模式持久化。在网上看到一篇讲这个讲得不错的:从官网的说明https://github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel#Pull模式有......
  • Sentinel控制台监控数据持久化到MySQL数据库
    阅读文本大概需要3分钟。    根据官方wiki文档,Sentinel控制台的实时监控数据,默认仅存储5分钟以内的数据。如需持久化,需要定制实现相关接口。https://github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel给出了指导步骤:自行扩展实现MetricsRepository接口;注册成......
  • Apollo使用实践
    Apollo是携程开源的一款分布式配置中心,用于集中管理和动态配置应用程序的配置项。它提供了实时的配置更新、配置版本管理、灰度发布等功能,可以帮助开发团队更好地管理和控制应用程序的配置。下面是使用Java代码实现Apollo入门示例的详细步骤:添加依赖项:在您的Java项目中,添加......
  • Sentinel整合Spring Cloud Gateway、Zuul详解
    Sentinel支持对SpringCloudGateway、Zuul等主流的APIGateway进行限流。编辑切换为居中添加图片注释,不超过140字(可选)Sentinel1.6.0引入了SentinelAPIGatewayAdapterCommon模块,此模块中包含网关限流的规则和自定义API的实体和管理逻辑:GatewayFlowRule:网关限流规......
  • Spring Cloud Alibaba Sentinel实现熔断限流代码示例
    SpringCloudAlibabaSentinel介绍SpringCloudAlibabaSentinel是一个面向分布式服务架构的流量控制组件,是SpringCloudAlibaba的核心组件之一。主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。代码示例以下是一个使用SpringC......
  • redis持久化
    一、Redis持久化,两种方案RDB--->存的是数据,恢复数据直接加载数据到内存中,速度快,丢失数据风险大redisdatabasebackupfile(redis数据备份文件),即在关闭redis时,执行save命令,把所有数据都记录到磁盘中,保存。执行时机:--1.手动执行--2.正常关机用save命令--3.自动触......
  • Java 进阶 - SpringJPA 持久层框架
    参考资料https://spring.io/projects/spring-data-jpa介绍SpringDataJPA是Spring基于ORM(ObjectRelationalMapping)框架、JPA规范的基础上封装的一套JPA应用框架,底层使用了Hibernate的JPA技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了......
  • redis 持久化
    为什么需要持久化,持久化是什么redis是基于内存的所以速度快,没有与磁盘交互。但是缺点就是断电或宕机数据就没了,这是不可接受的。持久化就是把内存的数据也存在磁盘上,用于redis重启后时恢复数据。两种方式RDB和AOFRDB快照操作,持久化当前内存中的数据。分为手动触发和自动......
  • 如何将日志配置文件放入到Apollo配置中心并支持热更新
    增加监听日志文件(LoggerConfiguration.java)@ServicepublicclassLoggerConfiguration{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(LoggerConfiguration.class);privatestaticfinalStringLOGGER_TAG="logging.level.";@Autowired......
  • redis持久化配置
    redis有两种持久化方式:RDB和AOF。具体差别跟优缺点可参考redis数据的两种持久化方式对比,本篇只介绍这两种方式怎么配置RDB配置方式默认情况下,是快照RDB的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名是dump.rdbredis.conf默认配置:save9001save30010sav......