Giter Club home page Giter Club 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 Introduction

Discovery【探索】云原生微服务解决方案

Total visits Total lines License Maven Central Javadocs Build Status Codacy Badge Stars Stars

Wiki Wiki Discovery PPT Discovery Page Discovery Platform Page Polaris Page

           

如果您觉得本框架具有一定的参考价值和借鉴意义,请帮忙在页面右上角 [Star]

简介

作者简介

  • Nepxion开源社区创始人
  • 2020年阿里巴巴**云原生峰会出品人
  • 2020年被Nacos和Spring Cloud Alibaba纳入相关开源项目
  • 2021年阿里巴巴技术峰会上海站演讲嘉宾
  • 2021年荣获陆奇博士主持的奇绩资本,进行风险投资的关注和调研
  • 2021年入选Gitee最有价值开源项目
  • 阿里巴巴官方书籍《Nacos架构与原理》作者之一
  • Spring Cloud Alibaba Steering Committer、Nacos Group Member
  • Spring Cloud Alibaba、Nacos、Sentinel、OpenTracing Committer & Contributor

商业合作

① Discovery系列

框架名称 框架版本 支持Spring Cloud版本 使用许可
Discovery 1.x.x ~ 6.x.x Camden ~ Hoxton 开源,永久免费
DiscoveryX 7.x.x ~ 10.x.x 2020 ~ 2023 闭源,商业许可

② Polaris系列

Polaris为Discovery高级定制版,特色功能

  • 基于Nepxion Discovery集成定制
  • 多云、多活、多机房流量调配
  • 跨云动态域名、跨环境适配
  • DCN、DSU、SET单元化部署
  • 组件灵活装配、配置对外屏蔽
  • 极简低代码PaaS平台
框架名称 框架版本 支持Discovery版本 支持Spring Cloud版本 使用许可
Polaris 1.x.x 6.x.x Finchley ~ Hoxton 闭源,商业许可
Polaris 2.x.x 7.x.x ~ 10.x.x 2020 ~ 2023 闭源,商业许可

有商业版需求的企业和用户,请添加微信1394997,联系作者,洽谈合作事宜

入门资料

Discovery【探索】企业级云原生微服务开源解决方案

① 快速入门

② 解决方案

③ 最佳实践

④ 平台界面

⑤ 框架源码

⑥ 指南示例源码

⑦ 指南示例说明

Polaris【北极星】企业级云原生微服务商业解决方案

① 解决方案

② 框架源码

③ 指南示例源码

④ 指南示例说明

  • Spring Cloud Finchley ~ Hoxton版本
  • Spring Cloud 202x版本

请联系我

微信、钉钉、公众号和文档

Star走势图

Stargazers over time

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  avatar

discoveryguide's Issues

配置全链路灰度条件命中和灰度匹配组合式策略 这一节中有关Spel表达式需要注意的地方举例文字错误

Spel表达式需要注意的地方:

任何值都大于null。当某个Header未传值,但又指定了该Header大于的表达式,那么正则结果是true。例如,表达式为#H['a'] > '2',但a作为Header未传递进来,即为null,判断结果为false
null满足不等于。当某个Header未传值,但又指定了该Header不等于的表达式,那么正则结果是true。例如,表达式为#H['a'] != '2',但a作为Header未传递进来,即为null,判断结果为true

admin example start error

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

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

30L0X159CHF@5P3 KALON

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

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:

配置全链路灰度条件权重和灰度匹配组合式策略 下面的规则示例标点符号有误

配置全链路灰度条件权重和灰度匹配组合式策略

这一节中的示例规则配置中的

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

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

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 吗?

拉最新的代码跑不起

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

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]

极简示例中权重策略的分配测试问题

极简示例中权重策略的分配测试无论是网关的还是全链路的,都没有成功,一直都在轮询。使用的版本后是5.1.2的,是我测试方法不对还是该版本没这个功能呢?

规则更新优化

···

{"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;
但还是更新到远程配置中心,在微服务端拉取配置的时候,在微服务端报了配置文件错误。

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"
}

极简版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,也是同样的结论。

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.