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

什么是营销网络上海做seo的公司

什么是营销网络,上海做seo的公司,网站建设中最有效网站推广方式,福州网站建站继上一篇文章什么#xff0c;这年头还有人不知道404_cow__sky的博客-CSDN博客后#xff0c;有些同学发现#xff0c;学了之后有啥用#xff0c;有什么实际场景可以用到吗#xff1f;程序员就是这样#xff0c;不习惯于纸上谈兵#xff0c;给一个场景show me code才是最实… 继上一篇文章什么这年头还有人不知道404_cow__sky的博客-CSDN博客后有些同学发现学了之后有啥用有什么实际场景可以用到吗程序员就是这样不习惯于纸上谈兵给一个场景show me code才是最实在的好了不扯淡了回归正文吧 一、场景 有这么一个场景大家看看怎么来实现在咱们使用sentinel熔断限流器alibaba/Sentinel: A powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) (github.com)时需要在dashboard展示和编辑各种各样的数据比如展示某个应用下集群机器列表、展示实时监控数据、规则展示、规则编辑等等。 dashboard展示图如下 二、需求拆解 看到这个场景后我们能想到的就是这些数据从哪里来又流向哪里清楚这个后才能制定具体的事实施方案。 这些需要展示的数据从哪里来 客户端 在dashboard上编辑规则后这些数据流向哪里 客户端 三、需求实现 那么在清楚需求之后总结起来就是一句话客户端有数据需要传到dashborad同样dashborad也有数据需要传到客户端。那么如何实现呢 dashboard 如何知道某个app下某个接口的通讯 ip port dashboard 如何接受客户端的请求 同样客户端如何接受dashboard的请求这是本文讲解的重点 sentinel 的实现逻辑如下 根据上图如果换做我们那估计就是分别在客户端和dashboard上开几个接口就ok了那么sentinel 是这么做的吗是也不是。我们拿dashboard从客户端读/写数据为例在早期的sentinel版本中并没有在客户端使用web容器开启http接口因为它觉得使用web容器的方式太重了。不信你看sentinel官方给出的解释 使用web容器太过于重要级我理解有两层含义第一就是web框架本身就比较重其次就是有些客户端并不是使用的spring或者spring mvc 框架为了减小依赖sentinel提供了比较原生的实现方式。从图中可以看出sentinel 专门写了一个transport模块用来通信早期的transport中包含sentinel-transport-simple-http 和 sentinel-transport-netty-http两个模块sentinel-transport-simple-http 使用的是jdk原生的socket 而sentinel-transport-netty-http采用的netty来实现http server。那么怎么实现的呢可以简单看看以 sentinel-transport-simple-http 模块为例其大概得执行过程是 可以简单看看代码 // HttpEventTask 类public void run() {if (socket null) {return;}PrintWriter printWriter null;InputStream inputStream null;try {long start System.currentTimeMillis();inputStream new BufferedInputStream(socket.getInputStream());OutputStream outputStream socket.getOutputStream();printWriter new PrintWriter(new OutputStreamWriter(outputStream, Charset.forName(SentinelConfig.charset())));String firstLine readLine(inputStream);CommandCenterLog.info([SimpleHttpCommandCenter] Socket income: firstLine , addr: socket.getInetAddress());CommandRequest request processQueryString(firstLine);if (firstLine.length() 4 StringUtil.equalsIgnoreCase(POST, firstLine.substring(0, 4))) {// Deal with post methodprocessPostRequest(inputStream, request);}// Validate the target command.String commandName HttpCommandUtils.getTarget(request);if (StringUtil.isBlank(commandName)) {writeResponse(printWriter, StatusCode.BAD_REQUEST, INVALID_COMMAND_MESSAGE);return;}// Find the matching command handler.CommandHandler? commandHandler SimpleHttpCommandCenter.getHandler(commandName);if (commandHandler ! null) {CommandResponse? response commandHandler.handle(request);handleResponse(response, printWriter);} else {// No matching command handler.writeResponse(printWriter, StatusCode.BAD_REQUEST, Unknown command commandName );}long cost System.currentTimeMillis() - start;CommandCenterLog.info([SimpleHttpCommandCenter] Deal a socket task: firstLine , address: socket.getInetAddress() , time cost: cost ms);} catch (RequestException e) {writeResponse(printWriter, e.getStatusCode(), e.getMessage());} catch (Throwable e) {CommandCenterLog.warn([SimpleHttpCommandCenter] CommandCenter error, e);try {if (printWriter ! null) {String errorMessage SERVER_ERROR_MESSAGE;e.printStackTrace();if (!writtenHead) {writeResponse(printWriter, StatusCode.INTERNAL_SERVER_ERROR, errorMessage);} else {printWriter.println(errorMessage);}printWriter.flush();}} catch (Exception e1) {CommandCenterLog.warn(Failed to write error response, e1);}} finally {closeResource(inputStream);closeResource(printWriter);closeResource(socket);}} CommandHandler? commandHandler SimpleHttpCommandCenter.getHandler(commandName); 这行代码就是根据commandName 获取 CommandHandlerCommandHandler 是一个顶层接口其实现类上定义了一个CommandMapping该注解中有个name字段用来定义command路径这里有点类似 RequestMapping的味道具体代码如下 CommandMapping(name tree, desc get metrics in tree mode, use id to specify detailed tree root) public class FetchTreeCommandHandler implements CommandHandlerString {Overridepublic CommandResponseString handle(CommandRequest request) {String id request.getParam(id);StringBuilder sb new StringBuilder();DefaultNode start Constants.ROOT;if (id null) {visitTree(0, start, sb);} else {boolean exactly false;for (Node n : start.getChildList()) {DefaultNode dn (DefaultNode)n;if (dn.getId().getName().equals(id)) {visitTree(0, dn, sb);exactly true;break;}}if (!exactly) {for (Node n : start.getChildList()) {DefaultNode dn (DefaultNode)n;if (dn.getId().getName().contains(id)) {visitTree(0, dn, sb);}}}}sb.append(\r\n\r\n);sb.append(t:threadNum pq:passQps bq:blockQps tq:totalQps rt:averageRt prq: passRequestQps 1mp:1m-pass 1mb:1m-block 1mt:1m-total).append(\r\n);return CommandResponse.ofSuccess(sb.toString());}private void visitTree(int level, DefaultNode node, /*NonNull*/ StringBuilder sb) {for (int i 0; i level; i) {sb.append(-);}if (!(node instanceof EntranceNode)) {sb.append(String.format(%s(t:%s pq:%s bq:%s tq:%s rt:%s prq:%s 1mp:%s 1mb:%s 1mt:%s),node.getId().getShowName(), node.curThreadNum(), node.passQps(),node.blockQps(), node.totalQps(), node.avgRt(), node.successQps(),node.totalRequest() - node.blockRequest(), node.blockRequest(),node.totalRequest())).append(\n);} else {sb.append(String.format(EntranceNode: %s(t:%s pq:%s bq:%s tq:%s rt:%s prq:%s 1mp:%s 1mb:%s 1mt:%s),node.getId().getShowName(), node.curThreadNum(), node.passQps(),node.blockQps(), node.totalQps(), node.avgRt(), node.successQps(),node.totalRequest() - node.blockRequest(), node.blockRequest(),node.totalRequest())).append(\n);}for (Node n : node.getChildList()) {DefaultNode dn (DefaultNode)n;visitTree(level 1, dn, sb);}} } 这样我们请求接口http://localhost:10000/tree?typeroot时其返回结果如下 同样sentinel-transport-netty-http 也是类似的逻辑这样看来一切安好。 四、spring-mvc 模式通信兼容 直到有一天有人提出以下问题 总的来看就是现在和dashboard交互的端口需要和sprinboot web 应用共用一个端口。那现在有个难题。由于已经存在 sentinel-transport-simple-http和sentinel-transport-netty-http 模块底层设计采用的是 CommandHandler 来适配各类请求那么如果是以web容器来执行mvc模式的请求该如何兼容呢 江湖中不缺好手时隔半年后有人提出在不改变底层设计的情况下只需要实现HandlerAdapter 和 HandlerMapping 即可看到这里是不是觉得很熟悉HandlerAdapter 和 HandlerMapping不就是大名鼎鼎的处理器适配器和处理器映射器吗咱们回顾下用大白话说HandlerMapping的作用就是根据url路径找handler HandlerAdapter就是对handler进行装饰忽略底层细节对上层提供统一的调用方法来进行handler处理。那么sentinel是怎么做的呢我们看看 public class SentinelApiHandlerAdapter implements HandlerAdapter, Ordered {private int order Ordered.LOWEST_PRECEDENCE;public void setOrder(int order) {this.order order;}Overridepublic int getOrder() {return order;}Overridepublic boolean supports(Object handler) {return handler instanceof SentinelApiHandler;}Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {SentinelApiHandler sentinelApiHandler (SentinelApiHandler) handler;// 调用底层的CommandHandler接口sentinelApiHandler.handle(request, response);return null;}Overridepublic long getLastModified(HttpServletRequest request, Object handler) {return -1;} } public class SentinelApiHandlerMapping extends AbstractHandlerMapping implements ApplicationListener {private static final String SPRING_BOOT_WEB_SERVER_INITIALIZED_EVENT_CLASS org.springframework.boot.web.context.WebServerInitializedEvent;private static Class webServerInitializedEventClass;static {try {webServerInitializedEventClass ClassUtils.forName(SPRING_BOOT_WEB_SERVER_INITIALIZED_EVENT_CLASS, null);RecordLog.info([SentinelApiHandlerMapping] class {} is present, this is a spring-boot app, we can auto detect port, SPRING_BOOT_WEB_SERVER_INITIALIZED_EVENT_CLASS);} catch (ClassNotFoundException e) {RecordLog.info([SentinelApiHandlerMapping] class {} is not present, this is not a spring-boot app, we can not auto detect port, SPRING_BOOT_WEB_SERVER_INITIALIZED_EVENT_CLASS);}}final static MapString, CommandHandler handlerMap new ConcurrentHashMap();private boolean ignoreInterceptor true;public SentinelApiHandlerMapping() {setOrder(Ordered.LOWEST_PRECEDENCE - 10);}Overrideprotected Object getHandlerInternal(HttpServletRequest request) throws Exception {String commandName request.getRequestURI();if (commandName.startsWith(/)) {commandName commandName.substring(1);}// 获取底层CommandHandlerCommandHandler commandHandler handlerMap.get(commandName);return commandHandler ! null ? new SentinelApiHandler(commandHandler) : null;}Overrideprotected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {return ignoreInterceptor ? new HandlerExecutionChain(handler) : super.getHandlerExecutionChain(handler, request);}public void setIgnoreInterceptor(boolean ignoreInterceptor) {this.ignoreInterceptor ignoreInterceptor;}public static void registerCommand(String commandName, CommandHandler handler) {if (StringUtil.isEmpty(commandName) || handler null) {return;}if (handlerMap.containsKey(commandName)) {CommandCenterLog.warn([SentinelApiHandlerMapping] Register failed (duplicate command): commandName);return;}handlerMap.put(commandName, handler);}public static void registerCommands(MapString, CommandHandler handlerMap) {if (handlerMap ! null) {for (Map.EntryString, CommandHandler e : handlerMap.entrySet()) {registerCommand(e.getKey(), e.getValue());}}}Overridepublic void onApplicationEvent(ApplicationEvent applicationEvent) {if (webServerInitializedEventClass ! null webServerInitializedEventClass.isAssignableFrom(applicationEvent.getClass())) {Integer port null;try {BeanWrapper beanWrapper new BeanWrapperImpl(applicationEvent);port (Integer) beanWrapper.getPropertyValue(webServer.port);} catch (Exception e) {RecordLog.warn([SentinelApiHandlerMapping] resolve port from event applicationEvent fail, e);}if (port ! null TransportConfig.getPort() null) {RecordLog.info([SentinelApiHandlerMapping] resolve port {} from event {}, port, applicationEvent);TransportConfig.setRuntimePort(port);}}} } 后来sentinel官方也采用了这种方法做了升级sentinel 1.8.2 升级说明如下 好了看到这里你是否对spring mvc web容器下的http请求过程有了更深的理解呢
http://www.hkea.cn/news/14526998/

相关文章:

  • 三门峡网站建设价格为wordpress安装iis rewrite 组件与配置方法
  • 厦门同安建设局网站创建网站做搞笑视频
  • 海尔集团网站是怎么做的惠安县道安办网站建设
  • 成都网页设计的网站建设怎样建设直播网站
  • 做网站电销话术php空间购买
  • 如何做旅游攻略网站商城网站开发技术有哪些
  • 做一网站要什么女装子wordpress
  • 做网站需要固定ip么滨州建设网站
  • 微信网站怎么开发政务网站集约化建设难点与建议
  • 手机网站后台开发一款像淘宝的app需要多少钱
  • ftp 网站做的最好自考网站是哪个
  • 国内哪些网站是php做的超级好看的html代码网页
  • 企业网站推广渠道手机自助建站平台
  • 沈阳网站seo排名网页视频下载器破解版
  • 商业图片素材网站上海模板建站公司
  • 3d云打印网站开发西安seo关键字优化
  • 网站建设有什么系统网站模板价格
  • 网站建设款如何入账软件开发工作
  • 蓝色织梦cms企业网站模板全站源码长沙服务专业的建网站
  • 备案网站负责人公司想制作网站吗
  • 做企业网站比较好的公司网站建设的步骤有哪些
  • wordpress链接英文网站优化名词解释
  • 成都哪家做网站做的好湖北孝感展示型网站建设价格
  • 公司网站的备案号是如何链接的农村自建房设计图及效果图
  • wordpress站群代开发公司英文
  • 网站建设三网合一指的是什么意思做百度网站还是安居客网站
  • 网站建设规划书样板前端后端都是网站开发吧
  • 张家口专业做网站公司国内公司网站需要备案吗
  • 企业建设网站需注意哪些事项深圳建网站服务商
  • 推荐电商网站建设网站定位模板