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

西安网站建设 早晨男女做污视频在线观看网站

西安网站建设 早晨,男女做污视频在线观看网站,网站建设软件 优帮云,重庆建网站派臣公司1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上#xff0c;为微服务开发调试工作提供便利 请求报文难模拟#xff1a;可以直接在测试环境页面上操作#xff0c;流量直接打到本地IDEA进行debug请求链路较长#xff1a;本地开发无需启动所有服务#xf…1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上为微服务开发调试工作提供便利 请求报文难模拟可以直接在测试环境页面上操作流量直接打到本地IDEA进行debug请求链路较长本地开发无需启动所有服务仅需要启动目标服务协同开发与其他人一同开发并且依赖对方开发的接口可以直接将自己本地服务的请求发到对方本地服务上 这是目前主要的使用目的当然也可以调整负载均衡逻辑配合网关的一些自定义配置扩充为灰度发布的效果 2. 实现原理 通过在网关以及Ribbon实现自定义的负载均衡策略将请求引流到本地。 PS需要服务器能访问本地需要类似OpenVPN这样赋予本地一个IP供服务器网关能请求到本地 开启OpenVPN之后本机会有多个IP通过配置指定注册到nacos上的IP spring.cloud.nacos.discovery.network-interface: 10.02.1 本地服务调整 本地启动时配置文件添加参数设置一个元数据作为服务的流量标识 比如mdm服务配置参数 spring.cloud.nacos.discovery.metadata.request-mark: azhuzhu服务启动之后我们可以在nacos的服务列表里看到元数据 2.2 网关负载均衡 服务分类 服务器服务metadata中没有 requestMark 参数本地服务metadata中带有 requestMark 参数 网关实现自定义负载均衡策略 判断请求头中是否带有本地流量标识requestMark 有标识判断有无metadata匹配的服务实例 有调用匹配的服务实例无判断目标请求有没有服务器服务实例 有服务器服务随机数负载无可用实例随机负载 无标识判断目标请求有没有服务器服务实例 有服务器服务随机数负载无可用实例随机负载 网关负载处理了第一目标服务假如调用链路为 mdm - commom-api我们启动的是common-api则需要在服务端的ribbon中做负载 2.3 请求发起 比如约定request-mark作为本地流量标识 请求头 request-markazhuzhu 表示流量优先打到带有元数据 request-markazhuzhu 的服务 浏览器操作通过浏览器插件ModHeader在浏览器发起请求时带上请求头HTTP工具带上自定义请求头 3. 具体代码介绍 以下所有注册的bean 都通过指定的配置参数开启 ConditionalOnProperty(name hg.request-mark.enable, havingValue true)3.1 自定义负载均衡器 网关及其他客户端的流量染色具体的负载逻辑实现 import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.reactive.DefaultResponse; import org.springframework.cloud.client.loadbalancer.reactive.EmptyResponse; import org.springframework.cloud.client.loadbalancer.reactive.Request; import org.springframework.cloud.client.loadbalancer.reactive.Response; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import reactor.core.publisher.Mono;import java.util.List; import java.util.Map; import java.util.Random; import java.util.stream.Collectors;/*** 自定义负载均衡器 用于开发环境的流量染色** author 阿猪 2024-08-09 11:45*/ Slf4j Configuration SuppressWarnings(deprecation) ConditionalOnProperty(name hg.request-mark.enable, havingValue true) LoadBalancerClients(defaultConfiguration {ReqMarkLoadBalancer.class}) public class ReqMarkLoadBalancer {public static final String REQUEST_MARK request-mark;/*** 开启流量染色时 替换默认的负载器** param environment 环境信息* param loadBalancerClientFactory 负载器工厂* return 自定义负载器*/BeanPrimarypublic ReactorLoadBalancerServiceInstance reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}static class RandomLoadBalancer implements ReactorServiceInstanceLoadBalancer {private final ObjectProviderServiceInstanceListSupplier serviceInstanceListSupplierProvider;private final String serviceId;public RandomLoadBalancer(ObjectProviderServiceInstanceListSupplier serviceInstanceListSupplierProvider,String serviceId) {this.serviceId serviceId;this.serviceInstanceListSupplierProvider serviceInstanceListSupplierProvider;}Overridepublic MonoResponseServiceInstance choose(Request request) {ServiceInstanceListSupplier supplier serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);String requestMark getRequestMark(request);return supplier.get().next().map(serviceInstances - processInstanceResponseByReqMark(serviceInstances, requestMark));}private String getRequestMark(Request? request) {// 客户端的负载 直接从 RequestContextHolder 拿请求头ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes ! null) {return attributes.getRequest().getHeader(REQUEST_MARK);}// 网关的负载从 request 取值网关覆盖了默认实现 把context塞进去了 不然拿到是 null 跟spring boot版本有关系if (!(request.getContext() instanceof ServerHttpRequest)) {return null;}ServerHttpRequest context (ServerHttpRequest) request.getContext();if (context.getHeaders().containsKey(REQUEST_MARK)) {return context.getHeaders().getFirst(REQUEST_MARK);}return null;}/*** 默认的随机数负载** param instances 可用服务实例* return 命中实例*/private ResponseServiceInstance getInstanceResponse(ListServiceInstance instances) {if (CollectionUtils.isEmpty(instances)) {log.warn(No instance available {}, serviceId);return new EmptyResponse();}Random random new Random();ServiceInstance instance instances.get(random.nextInt(instances.size()));return new DefaultResponse(instance);}private ResponseServiceInstance processInstanceResponseByReqMark(ListServiceInstance instances, String requestMark) {if (instances.isEmpty()) {return new EmptyResponse();}ServiceInstance sameClusterNameInst selectInstanceByReqMark(instances, requestMark);return new DefaultResponse(sameClusterNameInst);}private ServiceInstance selectInstanceByReqMark(ListServiceInstance instances, String requestMark) {// 元数据不带请求标识的服务, 标识为服务器上的服务ListServiceInstance serverInstances instances.stream().filter(instance - {MapString, String metadata instance.getMetadata();return MapUtils.isEmpty(metadata) || !metadata.containsKey(REQUEST_MARK);}).collect(Collectors.toList());if (StringUtils.isBlank(requestMark)) {if (CollectionUtils.isEmpty(serverInstances)) {return instances.get(new Random().nextInt(instances.size()));}return serverInstances.get(new Random().nextInt(serverInstances.size()));}ListServiceInstance matchInstances Lists.newArrayList();for (ServiceInstance instance : instances) {MapString, String metadata instance.getMetadata();if (MapUtils.isEmpty(metadata)) {continue;}if (metadata.containsKey(REQUEST_MARK) requestMark.equals(metadata.get(REQUEST_MARK))) {matchInstances.add(instance);}}Random random new Random();// 优先匹配到的服务 最后是随机if (CollectionUtils.isNotEmpty(matchInstances)) {return matchInstances.get(random.nextInt(matchInstances.size()));}// 然后是无标识服务(服务器上的服务)if (CollectionUtils.isNotEmpty(serverInstances)) {return serverInstances.get(random.nextInt(serverInstances.size()));}// 前两者都没有就随机获取return instances.get(random.nextInt(instances.size()));}}}3.2 流量标识请求头透传 这里使用Feign进行内部服务调用需要将原请求的流量标识 请求头继续传递下去保证后续的服务链路也能有流量染色的效果。 import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;/*** 流量染色 - 流量标识请求头透传** author 阿猪 2024-09-25 17:11*/ Component ConditionalOnProperty(name hg.request-mark.enable, havingValue true) public class ReqMarkRequestInterceptor implements RequestInterceptor {Overridepublic void apply(RequestTemplate requestTemplate) {// 从 request 中获取流量标识, 设置到 feign 的 requestTemplate中ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes ! null) {requestTemplate.header(ReqMarkLoadBalancer.REQUEST_MARK, attributes.getRequest().getHeader(ReqMarkLoadBalancer.REQUEST_MARK));}}}3.3 网关负载均衡-请求信息获取 由于这个方案中负载均衡是依靠 请求头 判断的详见上面请求头的获取ReqMarkLoadBalancer.getRequestMark 在spring boot 2.3.2 版本中 request.getContext是个空的没法获取请求信息 2.6.x 后面没有这个问题但需要关注下这个context的类型调整代码 以下是覆盖默认实现为 request 的 context 设置请求信息。 实际上是复制 ReactiveLoadBalancerClientFilter的源码稍作修改看倒数最后两行 import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.reactive.DefaultRequest; import org.springframework.cloud.client.loadbalancer.reactive.Request; import org.springframework.cloud.client.loadbalancer.reactive.Response; import org.springframework.cloud.gateway.config.LoadBalancerProperties; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; import org.springframework.cloud.gateway.support.DelegatingServiceInstance; import org.springframework.cloud.gateway.support.NotFoundException; import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;import java.net.URI;import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.*;/*** 覆盖默认的负载均衡器 改了choose方法 将request信息传入** see ReactiveLoadBalancerClientFilter* author 阿猪 2024-08-09 17:06*/ Slf4j Component ConditionalOnProperty(name hg.request-mark.enable, havingValue true) public class CustomLoadBalancerClientFilter extends ReactiveLoadBalancerClientFilter {private static final int LOAD_BALANCER_CLIENT_FILTER_ORDER 10150;private final LoadBalancerClientFactory clientFactory;private final LoadBalancerProperties properties;public CustomLoadBalancerClientFilter(LoadBalancerClientFactory clientFactory,LoadBalancerProperties properties) {super(null, null);this.clientFactory clientFactory;this.properties properties;}Overridepublic int getOrder() {return LOAD_BALANCER_CLIENT_FILTER_ORDER;}OverrideSuppressWarnings(Duplicates)public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {URI url exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);String schemePrefix exchange.getAttribute(GATEWAY_SCHEME_PREFIX_ATTR);if (url null|| (!lb.equals(url.getScheme()) !lb.equals(schemePrefix))) {return chain.filter(exchange);}// preserve the original urladdOriginalRequestUrl(exchange, url);if (log.isTraceEnabled()) {log.trace(ReactiveLoadBalancerClientFilter.class.getSimpleName() url before: url);}return choose(exchange).doOnNext(response - {if (!response.hasServer()) {throw NotFoundException.create(properties.isUse404(),Unable to find instance for url.getHost());}ServiceInstance retrievedInstance response.getServer();URI uri exchange.getRequest().getURI();// if the lb:scheme mechanism was used, use scheme as the default,// if the loadbalancer doesnt provide one.String overrideScheme retrievedInstance.isSecure() ? https : http;if (schemePrefix ! null) {overrideScheme url.getScheme();}DelegatingServiceInstance serviceInstance new DelegatingServiceInstance(retrievedInstance, overrideScheme);URI requestUrl reconstructURI(serviceInstance, uri);if (log.isTraceEnabled()) {log.trace(LoadBalancerClientFilter url chosen: requestUrl);}exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);}).then(chain.filter(exchange));}SuppressWarnings(deprecation)private MonoResponseServiceInstance choose(ServerWebExchange exchange) {URI uri exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);ReactorLoadBalancerServiceInstance loadBalancer this.clientFactory.getInstance(uri.getHost(), ReactorServiceInstanceLoadBalancer.class);if (loadBalancer null) {throw new NotFoundException(No loadbalancer available for uri.getHost());}// 就改了这里 仅调整参数传入 保持原有逻辑(原代码传入了空的request)Request? request new DefaultRequest(exchange.getRequest());return loadBalancer.choose(request);}}将bean覆盖掉替换掉原本的 ReactiveLoadBalancerClientFilter import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.gateway.config.LoadBalancerProperties; import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** 流量染色 - 将ReactiveLoadBalancerClientFilter覆盖掉 为了获取到http请求头** author 阿猪 2024-08-09 17:12*/ Configuration public class CustomLoadBalancerConfig {BeanConditionalOnProperty(name hg.request-mark.enable, havingValue true)public ReactiveLoadBalancerClientFilter gatewayLoadBalancerClientFilter(LoadBalancerClientFactory clientFactory,LoadBalancerProperties properties){return new CustomLoadBalancerClientFilter(clientFactory, properties);}}
http://www.dnsts.com.cn/news/77595.html

相关文章:

  • 公司微信网站开发平台平凉哪有做网站的
  • 网站优化设计方案怎样查网站和增加网站
  • 做网站可以用什么语言南京网站设计外包
  • 甘肃省建设厅官方网站张睿长沙有什么好玩的水上乐园
  • 网站如何做后台留言怎样组建企业网站
  • 手机怎样建网站my最新域名是什么
  • 安全的网站建设推广网站开发需要兼容到ie几
  • 百度制作企业网站多少钱凡客诚品app
  • 腾讯静态网站托管网页设计怎么运行
  • 商派商城网站建设方案百度seo关键词优化软件
  • 柴油网站怎么做网页版的微信
  • 动态型网站建设网站外链平台
  • 学院网站建设分工定制商品的网站建设
  • 说做网站被收债怎么把园林设计网站做的酷炫
  • 高端网站设计推广v信haotg8百度网站的总结
  • 国外优秀的网站建设公司室内设计说明200字
  • 做外国网站百度搜到wordpress虚拟主机安装教程
  • 可以进入任何网站的浏览器wordpress twig
  • 适合个人做外贸的网站企业网站建设要求
  • 三只松鼠建设网站前的市场分析网站联系qq代码
  • 大港天津网站建设比较好的网站空间
  • seo网站营销推广全程实例pdf灵台门户网站建设
  • 法律对网站建设的规制wordpress全景图
  • 美容平台网站建设网站开发培训哪里好
  • 单位网站平台建设汇报新手学做网站下载
  • 注册了域名之后如何建立一个网站拼团购物网站怎么做
  • 营销型网站建设+课程行业协会网站建设的方案
  • 朔州做网站创意极简logo
  • 婚纱网站怎么做seo生鲜网站制作
  • 网站开发公司哪家最强郴州网站制作