Code Monkey home page Code Monkey logo

nepxion / discoveryguide Goto Github PK

View Code? Open in Web Editor NEW
1.2K 38.0 278.0 2.29 MB

☀️ Nepxion Discovery Guide is a guide example for Nepxion Discovery 蓝绿灰度发布、路由、限流、熔断、降级、隔离、追踪、流量染色、故障转移、多活的指南示例

Home Page: http://www.nepxion.com

License: Apache License 2.0

Java 100.00%
spring-cloud gray-release nacos apollo sentinel skywalking opentelemetry blue-green-deployment

discoveryguide's People

Contributors

haojunren avatar terranhu avatar zshun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

discoveryguide's Issues

discovery-guide异步调用示例中header值的传递问题

验证场景:
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]

http://localhost:5001/discovery-guide-service-a/invoke/gateway 报错

使用标准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的,是我测试方法不对还是该版本没这个功能呢?

极简版spring.application.strategy.zuul.original.header.ignored开关失效

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' &amp;&amp; #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,也是同样的结论。

admin example start error

java.lang.NoClassDefFoundError: org/springframework/web/servlet/config/annotation/WebMvcConfigurer

rule不生效

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' &amp;&amp; #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
‘’‘ && ‘’‘ 是错误的, 应该用
&amp;&amp;
但还是更新到远程配置中心,在微服务端拉取配置的时候,在微服务端报了配置文件错误。

zuul 使用线程池隔离时,RequestContext 上下文会丢失

30L0X159CHF@5P3 KALON

在获取com.nepxion.discovery.plugin.strategy.zuul.context.ZuulStrategyContextHolder#getZuulRequestHeaders 中RequestContext 中 getZuulRequestHeaders 头的信息时,获取不到值,debug会发现,filter中 RequestContext 对象 和这里获取的 RequestContext 地址已经不是同一个地址,导致获取不到head中的版本信息,不能按规则去路由

拉最新的代码跑不起

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

service启动不了

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表达式需要注意的地方举例文字错误

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' &amp;&amp; #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 左边的双引号为中文双引号,导致报语法错误,让整个规则无法生效。

还请改为英文的双引号,谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.