当前位置: 首页 > news >正文

电子政务与网站建设 总结化妆品网站建设版块

电子政务与网站建设 总结,化妆品网站建设版块,长沙五百强企业名单,wordpress 前台编辑文章转载自 Springboot使用Sentinel限流#xff0c;集成zookeeper完成规则的持久化 上一篇简单介绍了sentinel限流的基本配置和使用#xff0c;这一篇我们来稍微深入一点#xff0c;看看如何将zookeeper继承进来#xff0c;用以保存添加的流控规则。 上一篇中我们启动了dash…转载自  Springboot使用Sentinel限流集成zookeeper完成规则的持久化 上一篇简单介绍了sentinel限流的基本配置和使用这一篇我们来稍微深入一点看看如何将zookeeper继承进来用以保存添加的流控规则。 上一篇中我们启动了dashboard.jar然后在客户端中指定了dashboard的地址。之后启动项目随便访问个接口之后就能在dashboard的界面上看到相应的请求了并且能在控制台上添加一些规则保存后客户端就能生效了。 基于内存的推送 那么它的内部原理是什么呢来简单了解一下。 从官方文档可以看到客户端在引入了Sentinel后并指定dashboard的地址启动后将会在客户端启动一个http服务默认占用8719端口。由于我们是引入的SpringCloud的模块就已经包含了下面的引入。 引入这个transport模块的原因就是为了接收dashboard推送过来的配置规则。可以看看官方文档的介绍默认就是“原始模式”。所谓的原始模式就是指客户端启动web服务连上dashboard后在dashboard配置的规则由dashboard发起http请求来修改。修改后的规则直接保存在客户端内存中并即时生效。 这种方式原理简单一般用于入门测试使用生产环境不能用。基于内存存储在客户端重启后所有规则都会丢失需要重新配置。而且不适用于客户端多个实例因为彼此之间不共享规则倘若启动多个实例需要多次重复配置。很明显这不是我们想要的那种结果。 官方提供了三种模式上面的“原始模式”、“pull模式”、“push模式”。pull模式就是搞个文件存着隔一会去请求一下看看有没有变化如果变了就更新到内存很明显这种模式存在延迟也不建议上生产。那就来看看“push模式”吧。 基于zookeeper的推送 从上面可以看到要想能持久化规则的存储并且在多个实例间共享就需要一个第三方的存储。让dashboard对规则的修改能及时存储到第三方并及时通知客户端完成修改。官方给了三种示例推荐Apollo、Nacos、Zookeeper它们的使用类似我们以zookeeper为例来看看怎么使用。 客户端pom文件添加zookeeper的依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependencydependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-zookeeper/artifactId/dependency 然后客户端修改获取规则的地方为从zookeeper获取规则。 import com.alibaba.csp.sentinel.datasource.ReadableDataSource;import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.TypeReference;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.util.List;/*** author wuweifeng wrote on 2019/7/1.*/Componentpublic class ZookeeperSentinelConfig {Value(${spring.application.name})private String appName;PostConstructpublic void loadRules() {final String remoteAddress 127.0.0.1:2181;final String path /sentinel_rule_config/ appName;ReadableDataSourceString, ListFlowRule flowRuleDataSource new ZookeeperDataSource(remoteAddress, path,source - JSON.parseObject(source, new TypeReferenceListFlowRule() {}));FlowRuleManager.register2Property(flowRuleDataSource.getProperty());}} 这一步很简单大家自行去下载个zookeeper的安装文件启动即可。在方法里指定zookeeper的地址和要监听变化的path然后注册一下就好了。客户端到这里就完毕了。 重新启动客户端后就会变成从zookeeper的固定path里获取rule规则。之后对该path做的变化都会即时更新到客户端并应用新的规则。 这里我们测试一下 RestControllerpublic class TestController {GetMapping(value /hello)public String hello() {return Hello Sentinel;}GetMapping(value /test)SentinelResource(value TestResource, blockHandler handleException)public String test() {return Hello TestResource;}// Fallback 函数函数签名与原函数一致或加一个 Throwable 类型的参数.public String handleException(BlockException ex) {return handleException;}} 上面是一个简单的Controller里面定义了一个resource。之后我们通过对zookeeper的path推送该resource的规则来测试是否生效。 import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.retry.ExponentialBackoffRetry;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.data.Stat;/*** author wuweifeng wrote on 2019/7/1.*/public class ZookeeperConfigSender {private static final int RETRY_TIMES 3;private static final int SLEEP_TIME 1000;public static void main(String[] args) throws Exception {final String remoteAddress localhost:2181;final String rule [\n {\n \resource\: \TestResource\,\n \controlBehavior\: 0,\n \count\: 1.0,\n \grade\: 1,\n \limitApp\: \default\,\n \strategy\: 0\n }\n ];CuratorFramework zkClient CuratorFrameworkFactory.newClient(remoteAddress, new ExponentialBackoffRetry(SLEEP_TIME, RETRY_TIMES));zkClient.start();String appName your-app-name;String path /sentinel_rule_config/ appName;Stat stat zkClient.checkExists().forPath(path);if (stat null) {zkClient.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, null);}zkClient.setData().forPath(path, rule.getBytes());try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}zkClient.close();}} 这就是测试代码运行后就会往zookeeper写入一个rule设置名为TestResource的qps为1并应用到客户端。无论启动多少个客户端实例都会生效这个rule。 看到这里其实已经完成了基于push的动态规则功能了可以通过zkui这种zookeeper界面工具或者通过代码来查询、修改zookeeper里的rule配置json来完成对客户端规则的控制。 那么可能有人会问了dashboard呢用那个界面操作不是更方便吗 事实上对客户端的限流与dashboard没一点关系只用zookeeper就能完成了。那么这时你再启动dashboard当然也是能用的因为客户端的web服务还是启动着的也能接收到来自于dashboard的推送。只是来自于dashboard的在客户端重启后会失效在zookeeper里的会仍然存在。 那么我们应该改造一下dashboard让在界面上的操作也推送到zookeeper里去这样就方便多了。 在GitHub上下载Sentinel的源码里面有dashboard的工程我们来修改一下它的代码就好了。 先修改一下pom文件把scope注释掉。 找到rule包添加个zookeeper文件夹里面有4个类。 可以直接从工程的test测试代码里直接把zookeeper包抄过去就行并把rule下原来的FlowRuleApiProvider和FlowRuleApiPublisher给注释掉。 test源码里已经提供了基于三种中间件的配置代码了抄过去就行。 抄过去后修改一下RULE_ROOT_PATH保持和客户端配置的是一致的。 之后找到Controller包下的v2包如果你设置的FlowRuleZookeeperProvider和publisher两个bean有名字可以在autowired时指定为你设置的名字或者用Resource。 最后修改一下sidebar.html将原来的flowV1改为如图。 这样就ok了。 重新启动dashboard项目重启客户端。这样dashboard就已经和zookeeper关联起来了dashboard的操作就由原来的操作客户端的api变成了操作zookeeper。你所有在dashboard界面上做的配置都会存储到zookeeper中并实时推送到客户端。客户端重启后dashboard不受影响。这样就完成了多实例共享流控规则。
http://www.pierceye.com/news/902173/

相关文章:

  • 嘉峪关建设路小学网站游戏网页链接
  • 阿里云 网站根目录广东建筑企业50强
  • 河北省网络科技网站装饰设计素描
  • 合肥网站建设索q479185700企业做网站公司哪家好
  • wordpress暂停网站兰州网站建设方法
  • 丰台网站制作html教程 菜鸟教程
  • 在那个网站做直播好赚钱吗重庆妇科医院排名大全
  • 在线教育网站建设投标书查询公司的网站备案信息查询
  • 俄文网站策划wdcp wordpress
  • 建设个人网站流程中国工程建设招聘信息网站
  • 电影网站设计说明书在原域名给公司建立网站
  • 小规模公司做网站成本是什么wordpress主题转html
  • seo做的比较好的网站的几个特征app网站建设教程视频教程
  • 网站建设规范优质高等职业院校建设网站
  • 国内做网站哪家公司好机票什么网站建设
  • 万盛经开区建设局官方网站高校校园网站建设的要求
  • 制作企业网站的实训报告防伪码查询网站怎么做的
  • 做网站会很忙吗网站 js 广告代码
  • 没有网站域名备案专业做书画推广的网站
  • 做app网站公司名称有没有做黑市网站
  • apache建设网站做网站页面代码
  • html5 单页网站网络运维从入门到精通
  • 联合建设官方网站银川网站seo
  • jsp网站开发与设计摘要网站开发是什么
  • 公司网站建设论文结束语谷歌建站多少钱
  • 陕西省建设工会网站漳州做网站最便宜
  • asp网站怎么做301定向辽宁网络优化方法
  • 足球网站建设无锡企业网站的建设
  • 网站建设 国风网络学校网站建设新闻
  • 网站集成微信登录ai logo设计网站