sentinel管控台实践

编程

前言:因为目前开源版本的管控台不适合在生成环境使用,这里自己对管控台进行了改造

管控台地址:https://gitee.com/lis1314/sentinel-dashboard

 

一、管控台改造

基于1.7.0的管控台UI,jar包使用1.7.1(从1.7.0升级)
1、簇点链路页面UI默认视图从原(树状视图)改成(列表视图)
2、流控规则、降级规则、热点规则、系统规则、授权规则,全部持久化(zookeeper)
3、对规则持久化的ID从默认的,automicinteger改成使用SnowflakeId生成算法(这里原是18位,但是由于js的精度问题,后台改成了12位,截取了左侧的6位)
具体(SnowflakeIdWorker)类
4、删除了单机版的流控规则配置,不支持单机版的流控规则
5、删除了DynamicRuleProvider、DynamicRulePublisher类,使用(DynamicRuleDrive)替代了这两个接口的方法(1.发布规则、2.获取规则)

二、客户端集成管控台

在sentinel.properties文件中由于一些原因,想去使用spring的ognl表达式去动态配置一些属性

以及和dubbo应用以及其他比如监控统一命名,project name 想写在配置文件中的种种问题吧。

下面是sentinel客户端(业务应用)配置管控台的集成方式

1、properties

# zookeeper address

zkServer=${zookeeperAddress}

#https://github.com/alibaba/Sentinel/wiki/启动配置项

#project.name 参数只能通过 JVM -D 参数方式配置,其它参数支持所有的配置方式

project.name=${spring.config.name}

#最大的有效响应时长(ms),超出此值则按照此值记录,default(4900)

csp.sentinel.statistic.max.rt=100000

#心跳包发送周期,单位毫秒

csp.sentinel.heartbeat.interval.ms=60000

#控制台的地址,指定控制台后客户端会自动向该地址发送心跳包。地址格式为:hostIp:port

csp.sentinel.dashboard.server=${sentinel.dashboard.server}

2、spring 配置

package com.gomeplus.bs.sentinel;

import java.util.HashMap;

import java.util.Map;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.PropertySource;

import org.springframework.stereotype.Component;

import lombok.Data;

/**

* https://github.com/alibaba/Sentinel/wiki/启动配置项

*

* @author lisuo

*

*/

@PropertySource("classpath:sentinel.properties")

@ConfigurationProperties

@Component

@Data

public class SentinelConfig implements InitializingBean {

private String zkServer;

private Map<String, String> project = new HashMap<>();

private Map<String, String> csp = new HashMap<>();

@Override

public void afterPropertiesSet() throws Exception {

for (Map.Entry<String, String> e : csp.entrySet()) {

System.setProperty("csp." + e.getKey(), e.getValue());

}

for (Map.Entry<String, String> e : project.entrySet()) {

System.setProperty("project." + e.getKey(), e.getValue());

}

}

}

这样一来,如果需要增加新的sentinel配置参数,都会进行很好的支持了

3、配置zookeeper规则数据源

package com.gomeplus.bs.sentinel;

import java.util.ArrayList;

import java.util.List;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Lazy;

import com.alibaba.csp.sentinel.datasource.Converter;

import com.alibaba.csp.sentinel.datasource.ReadableDataSource;

import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource;

import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;

import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;

import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;

import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;

import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;

import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;

import com.alibaba.csp.sentinel.slots.system.SystemRule;

import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

/**

* zookeeper接入

*

* @author lisuo

*

*/

@Configuration

public class ZkDataSourceConfig implements InitializingBean {

@Autowired

@Lazy

private SentinelConfig sentinelConfig;

@Override

public void afterPropertiesSet() throws Exception {

FlowRuleManager.register2Property(getDataSource(FlowRule.class).getProperty());

AuthorityRuleManager.register2Property(getDataSource(AuthorityRule.class).getProperty());

DegradeRuleManager.register2Property(getDataSource(DegradeRule.class).getProperty());

SystemRuleManager.register2Property(getDataSource(SystemRule.class).getProperty());

ParamFlowRuleManager.register2Property(getDataSource(ParamFlowRule.class).getProperty());

}

private <T> ReadableDataSource<String, List<T>> getDataSource(Class<T> clazz){

final String path = "/sentinel_rule_config/" + sentinelConfig.getProject().get("name")+"/"+clazz.getSimpleName();

// path 对应 ZK 中的数据路径

Converter<String, List<T>> converter = new Converter<String, List<T>>() {

@Override

public List<T> convert(String source) {

if(source!=null && !"".equals(source.trim()) && !"[]".equals(source)){

List<T> list = new ArrayList<>();

JSONArray array = JSON.parseArray(source);

for (int i=0;i<array.size();i++) {

JSONObject obj = array.getJSONObject(i);

JSONObject rule = obj.getJSONObject("rule");

T r = rule.toJavaObject(clazz);

list.add(r);

}

return list;

}

return null;

}

};

return new ZookeeperDataSource<>(sentinelConfig.getZkServer(), path,converter);

}

}

 

以上是 sentinel管控台实践 的全部内容, 来源链接: utcz.com/z/512706.html

回到顶部