nepxion / discoveryguide Goto Github PK
View Code? Open in Web Editor NEW☀️ Nepxion Discovery Guide is a guide example for Nepxion Discovery 蓝绿灰度发布、路由、限流、熔断、降级、隔离、追踪、流量染色、故障转移、多活的指南示例
Home Page: http://www.nepxion.com
License: Apache License 2.0
☀️ Nepxion Discovery Guide is a guide example for Nepxion Discovery 蓝绿灰度发布、路由、限流、熔断、降级、隔离、追踪、流量染色、故障转移、多活的指南示例
Home Page: http://www.nepxion.com
License: Apache License 2.0
验证场景:
1.启动discovery-guide-zuul、discovery-guide-service中的A1、B1和B2
2.使用http://localhost:5002/discovery-guide-service-a/invoke-async/zuul,调用A1中的invokeAsync接口。传入header中包含n-d-version。
查看A1的日志,发现传入的n-d-version在Intercept Output Header Information,不会传给下游的B服务。想请教一下,是否该类异步调用场景不在灰度考虑范围?还是需要另外的配置来支持异步时header往下游服务传值?
---------------- Trace Information ---------------
trace-id=9aaa02fbcc799fd5
span-id=a177ba15233233aa
n-d-service-group=discovery-guide-group
n-d-service-type=service
n-d-service-id=discovery-guide-service-a
n-d-service-address=192.168.1.104:3001
n-d-service-version=1.0
n-d-service-region=dev
n-d-service-env=env1
n-d-version={"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.1"}
mobile=
user=
--------------------------------------------------
discovery 2020-03-28 11:03:41,166 INFO [http-nio-3001-exec-8] [] [] [] [] [] [] [] [] [] [] [] [] i.j.i.r.LoggingReporter [LoggingReporter.java:43] - Span reported: 9aaa02fbcc799fd5:a177ba15233233aa:3f91e250efa0012a:1 - GRAY
------- Intercept Output Header Information ------
n-d-service-address=[192.168.1.104:3001]
n-d-service-env=[env1]
n-d-service-group=[discovery-guide-group]
n-d-service-id=[discovery-guide-service-a]
n-d-service-region=[dev]
n-d-service-type=[service]
n-d-service-version=[1.0]
最新的discovery版本只有6.19.0,能否给一个6.19.0的案例出来,6.20.的依懒包下载不下来
使用标准postman文件,服务启动都没有问题,nacos也注册成功,但是postman调用报错
{
"timestamp": "2019-10-23T09:17:18.735+0000",
"path": "/discovery-guide-service-a/invoke/gateway",
"status": 503,
"error": "Service Unavailable",
"message": "Unable to find instance for discovery-guide-service-a"
}
极简示例中权重策略的分配测试无论是网关的还是全链路的,都没有成功,一直都在轮询。使用的版本后是5.1.2的,是我测试方法不对还是该版本没这个功能呢?
discovery.version 6.0.5
开关配置如下:
#当外界传值Header的时候,网关也设置并传递同名的Header,需要决定哪个Header传递到后边的服务去。如果下面开关为true,以网关设置为优先,否则以外界传值为优先。缺失则默认为true
#spring.application.strategy.zuul.header.priority=false
#当以网关设置为优先的时候,网关未配置Header,而外界配置了Header,仍旧忽略外界的Header。缺失则默认为true
spring.application.strategy.zuul.original.header.ignored=true
策略配置如下:
<strategy>
<version>{"discovery-yd-service-a":"1.0", "discovery-yd-service-b":"1.0"}</version>
</strategy>
<strategy-customization>
<conditions type="blue-green">
<condition id="condition1" header="#H['a'] == '1'" version-id="version-route2"/>
<condition id="condition2" header="#H['a'] == '1' && #H['b'] == '2'" version-id="version-route1"/>
</conditions>
<routes>
<route id="version-route1" type="version">{"discovery-yd-service-a":"1.1", "discovery-yd-service-b":"1.1"}</route>
<route id="version-route2" type="version">{"discovery-yd-service-a":"1.0", "discovery-yd-service-b":"1.1"}</route>
</routes>
</strategy-customization>
postman请求Zuul网关调用示例时,指定Header a = 1;
按照spring.application.strategy.zuul.original.header.ignored的解释,网关优先并且网关未配置header时,即使前端配置了Header也会忽略,本例应该选择默认的strategy策略路由;但经过实际测试,发现前端Header依然会让路由策略生效。postman返回结果为
zuul -> [ID=discovery-yd-service-a][P=Eureka][H=192.168.1.xx:3001][V=1.0][R=dev][E=env1][G=discovery-yd-group][TID=ae16acbdc83f22a5][SID=69939cfd6578554c] -> [ID=discovery-yd-service-b][P=Eureka][H=192.168.1.xx:4002][V=1.1][R=dev][E=common][G=discovery-yd-group][TID=ae16acbdc83f22a5][SID=433951c9bedf320e]
选择的是version-route2这个条件路由策略。
将spring.application.strategy.zuul.original.header.ignored这个开关设置为false,也是同样的结论。
java.lang.NoClassDefFoundError: org/springframework/web/servlet/config/annotation/WebMvcConfigurer
discovery-guide-gateway
eureka
MySubscriber 在A1, A2,B1,B2中确认过都拉了最新的rule
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<!-- 基于Http Header传递的策略路由,全局缺省路由(第三优先级) -->
<strategy>
<version>{"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.0"}</version>
</strategy>
<!-- 基于Http Header传递的定制化策略路由,支持蓝绿部署和灰度发布两种模式。如果都不命中,则执行上面的全局缺省路由 -->
<strategy-customization>
<!-- 全链路蓝绿部署:条件命中的匹配方式(第一优先级),支持版本匹配、区域匹配、IP地址和端口匹配、版本权重匹配、区域权重匹配 -->
<!-- Header节点不允许缺失 -->
<conditions type="blue-green">
<condition id="condition1" header="#H['a'] == '1'" version-id="version-route2"/>
<condition id="condition2" header="#H['a'] == '1' && #H['b'] == '2'" version-id="version-route1"/>
</conditions>
<routes>
<route id="version-route1" type="version">{"discovery-guide-service-a":"1.1", "discovery-guide-service-b":"1.1"}</route>
<route id="version-route2" type="version">{"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.1"}</route>
</routes>
</strategy-customization>
</rule>
但是调用
http://localhost:5001/discovery-guide-service-a/invoke/gateway
把a=1 header勾上 A服务还是在1.0, 1.1中调用 难道不是只调用1.0 吗?
···
{"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.0"}<!-- 基于Http Header传递的定制化策略路由,支持蓝绿部署和灰度发布两种模式。如果都不命中,则执行上面的全局缺省路由 -->
<strategy-customization>
<!-- 全链路灰度发布:条件命中的随机权重(第二优先级),支持版本匹配、区域匹配、IP地址和端口匹配 -->
<!-- Header节点允许缺失,当含Header和未含Header的配置并存时,以未含Header的配置为优先 -->
<conditions type="gray">
<condition id="condition1" header="#H['a'] == '1'" version-id="version-route1=10;version-route2=90"/>
<condition id="condition2" header="#H['a'] == '1' && #H['b'] == '2'" version-id="version-route1=85;version-route2=15"/>
<condition id="condition3" version-id="version-route1=95;version-route2=5"/>
</conditions>
<routes>
<route id="version-route1" type="version">{"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.0"}</route>
<route id="version-route2" type="version">{"discovery-guide-service-a":"1.1", "discovery-guide-service-b":"1.1"}</route>
</routes>
</strategy-customization>
更新配置的时候
http://localhost:6001/console/remote-config/update
‘’‘ && ‘’‘ 是错误的, 应该用
&&
但还是更新到远程配置中心,在微服务端拉取配置的时候,在微服务端报了配置文件错误。
import com.google.common.collect.ImmutableMap;
import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.plugin.strategy.service.tracer.DefaultServiceStrategyTracer;
import com.nepxion.discovery.plugin.strategy.service.tracer.ServiceStrategyTracerInterceptor;
import com.nepxion.discovery.plugin.strategy.tracer.StrategyTracerContext;
// 自定义调用链和灰度调用链输出到日志和Opentracing
public class MyServiceStrategyTracer extends DefaultServiceStrategyTracer {
private static final Logger LOG = LoggerFactory.getLogger(MyServiceStrategyTracer.class);
找不到 StrategyTracerContext
DiscoveryGuideServiceA1 类 以下类 找不到
import com.nepxion.discovery.plugin.strategy.service.filter.ServiceStrategyRouteFilter;
import com.nepxion.discovery.plugin.strategy.service.monitor.ServiceStrategyMonitorAdapter;
import com.nepxion.discovery.plugin.strategy.service.sentinel.adapter.ServiceSentinelRequestOriginAdapter;
暂时删除后 启动页失败
Description:
Field strategyContextHolder in com.nepxion.discovery.plugin.strategy.aop.AbstractStrategyInterceptor required a bean of type 'com.nepxion.discovery.plugin.strategy.context.StrategyContextHolder' that could not be found.
The injection point has the following annotations:
Spel表达式需要注意的地方:
任何值都大于null。当某个Header未传值,但又指定了该Header大于的表达式,那么正则结果是true。例如,表达式为#H['a'] > '2',但a作为Header未传递进来,即为null,判断结果为false
null满足不等于。当某个Header未传值,但又指定了该Header不等于的表达式,那么正则结果是true。例如,表达式为#H['a'] != '2',但a作为Header未传递进来,即为null,判断结果为true
配置全链路灰度条件权重和灰度匹配组合式策略
这一节中的示例规则配置中的
<conditions type=“gray">
<condition id="condition1" header="#H['a'] == '1'" version-id="version-route1=10;version-route2=90"/>
<condition id="condition2" header="#H['a'] == '1' && #H['b'] == '2'" version-id="version-route1=85;version-route2=15"/>
<condition id="condition3" version-id="version-route1=95;version-route2=5"/>
</conditions>
conditions type 左边的双引号为中文双引号,导致报语法错误,让整个规则无法生效。
还请改为英文的双引号,谢谢!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.