ShenYu is High-Performance Java API Gateway.

Overview

Scalable, High Performance, Responsive API Gateway Solution for all MicroServices

https://shenyu.apache.org/

English | 简体中文

github forks github stars github contributors



Architecture


Features

  • ShenYu provides ability such as current limiting, fusing, forwarding, routing monitoring and so on by its plugins.

  • Support HTTP, RESTFul, WebSocket, Dubbo, GRPC, Tars and Spring Cloud Proxy.

  • Plug-in hot plug, users can customize the development.

  • Selectors and rules are dynamically configured for flexible matching.

  • Support for cluster deployment.

  • Support A/B test and grayscale publishing.


Quick Start (docker)

Run Apache ShenYu Admin

> docker pull apache/shenyu-admin
> docker network create shenyu
> docker run -d -p 9095:9095 --net shenyu apache/shenyu-admin

Run Apache ShenYu Bootstrap

> docker network create shenyu
> docker pull apache/shenyu-bootstrap
> docker run -d -p 9195:9195 --net shenyu apache/shenyu-bootstrap

Set router

{
  "name" : "Shenyu",
  "data" : "hello world"
}
  • Set routing rules(Standalone)
curl --location --request POST 'http://localhost:9195/shenyu/plugin/selectorAndRules' \
--header 'Content-Type: application/json' \
--data-raw '{
    "pluginName": "divide",
    "selectorHandler": "[{\"upstreamUrl\":\"127.0.0.1:8080\"}]",
    "conditionDataList": [{
        "paramType": "uri",
        "operator": "match",
        "paramValue": "/**"
    }],
    "ruleDataList": [{
        "ruleHandler": "{\"loadBalance\":\"random\"}",
        "conditionDataList": [{
            "paramType": "uri",
            "operator": "match",
            "paramValue": "/**"
        }]
    }]
}'
{
  "name" : "Shenyu",
  "data" : "hello world"
}

Plugin

Whenever a request comes in, ShenYu will execute it by all enabled plugins through the chain of responsibility.

As the heart of ShenYu, plugins are extensible and hot-pluggable.

Different plugins do different things.

Of course, users can also customize plugins to meet their own needs.

If you want to customize, see custom-plugin


Selector & rule

According to your HTTP request headers, selectors and rules are used to route your requests.

Selector is your first route, It is coarser grained, for example, at the module level.

Rule is your second route and what do you think your request should do. For example a method level in a module.

The selector and the rule match only once, and the match is returned. So the coarsest granularity should be sorted last.


Data Caching & Data Sync

Since all data have been cached using ConcurrentHashMap in the JVM, it's very fast.

When user have changed the configuration in the background management, ShenYu will dynamically updates its cache by listening to the ZooKeeper node, WebSocket push, HTTP longPull.


Prerequisite

  • JDK 1.8+

Document & Website

EN doc CN doc


Stargazers over time

Stargazers over time


Known Users

In order of registration, More access companies are welcome to register at https://github.com/apache/incubator-shenyu/issues/68 (For open source users only)

All Users : Known Users

Comments
  • Discuss about initial committers

    Discuss about initial committers

    Hi, community.

    Our project is under discussion about joining in the Apache Incubator.

    It's helpful to launch a discussion about the initial committers list based on codes and community contributions.

    codes

    I propose the following 2 rules to soul and soul-dashboard (Both conditions are met):

    • Commits count >=7 in one project
    • Add code lines >=1000 in one project

    community

    • Actively running the community as a mentor (mentor : Meetup organizers or Community keynote speaker)
    • Answering community questions

    proposal

    The following contributors will be nominated initial committers.

    soul (github-id) :

    yu199195 dengliming tydot SteNicholas Asxing nuo-promise huangxfchn lw1243925457 SaberSola CCLooMi Trafalgar-YuI 0x12FD16B KevinClair

    soul-dashboard (github-id)

    xlgm fightingting fengzhenbing

    community(github-id)

    kimmking: as Apache Dubbo & ShardingSphere PMC member, he organizes source sharing activities, bringing important help to the community. tuohai666 : as Apache ShardingSphere PMC member, he is actively involved in community discussions and activities, and give powerful help about the community conform to Apache Way.

    Finally

    Above is just my suggestion, welcome anybody to discuss together (Fair, just and open).

    Voters can either respond "agree, yes, +1", or "advice".

    status: discuss 
    opened by yu199195 73
  • Collect suggestions for Soul renamed

    Collect suggestions for Soul renamed

    Hi All guys:

    soul will be rename, Could you do me a small favor?

    The name rules are as follows :

    • The name is easy to understand

    • It is best to have a name with the meaning of gateway such as bridge, proxy, governance

    • The name cannot be the same as the existing project name

    • Don't use your name for other trademarks

    thanks ALL

    status: volunteer wanted 
    opened by yu199195 51
  • [Volunteer] format  SQL to improve code readability in shenyu-admin.

    [Volunteer] format SQL to improve code readability in shenyu-admin.

    Description

    Hi Community: This PR is to format the current SQL, following the principle of right-aligning keywords (Uppercase) and left-aligning fields. I would like to make this task a good first issue so that new comers can get involved in handling the rest of the SQL file. Do you think it's a good idea?

    for example: before formatting:

    select id, name, age from user where id = 1
    

    after formatting

      SELECT id, 
             name, 
             age 
        FROM user
       WHERE id = 1
    

    Task List

    • [x] 1. app-auth-sqlmap.xml @midnight2104
    • [x] 2. auth-param-sqlmap.xml @hutaishi
    • [x] 3. auth-path-sqlmap.xml @ShawnSiao
    • [x] 4. dashboard-user-sqlmap.xml @Jingwugate
    • [x] 5. data-permission-sqlmap.xml @Mayank-KS
    • [x] 6. meta-data-sqlmap.xml @selectbook
    • [x] 7. permission-sqlmap.xml @wklong
    • [x] 8. plugin-handle-sqlmap.xml joker-zxs
    • [x] 9. plugin-sqlmap.xml @zhangcly
    • [x] 10. resouce-sqlmap.xml @nydia
    • [x] 11. role-sqlmap.xml @Albertsirius
    • [x] 12. rule-condition-sqlmap.xml @UniverseInHeart
    • [x] 13. rule-sqlmap.xml @totalo
    • [x] 14. selector-condition-sqlmap.xml @lanseBlue
    • [x] 15. selector-sqlmap.xml @xiaheshun
    • [x] 16. shenyu-dict-sqlmap.xml @shallwetalkge
    • [x] 17. user-role-sqlmap.xml @erdengk

    Notice: input about issue 3088 in your pr desc .

    status: volunteer wanted good first issue admin type: refactor level: easy 
    opened by midnight2104 39
  • [Volunteer] <Remove warning  code in shenyu-plugin module>

    [Volunteer]

    Volunteer help

    • [x] shenyu-plugin-api @songyuequan
    • [x] shenyu-plugin-base @songyuequan
    • [x] shenyu-plugin-global @heihei180
    • [x] shenyu-plugin-logging @YanHui-Yang
    • [x] shenyu-plugin-request @dizent
    • [x] shenyu-plugin-resilience4j @haibo-duan
    • [x] shenyu-plugin-response @haibo-duan
    • [x] shenyu-plugin-rewrite @zendwang
    • [x] shenyu-plugin-sign @zendwang
    • [x] shenyu-plugin-tars @haibo-duan
    • [x] shenyu-plugin-uri @haibo-duan
    • [x] shenyu-plugin-context-path @AhahaGe
    • [x] shenyu-plugin-redirect @YanHui-Yang
    • [x] shenyu-plugin-motan @YanHui-Yang
    • [x] shenyu-plugin-oauth2 @choconana
    • [x] shenyu-plugin-ratelimiter @choconana
    • [x] shenyu-plugin-sofa @li-keguo
    • [x] shenyu-plugin-cryptor @impactCn
    • [x] shenyu-plugin-monitor @Jossc
    • [x] shenyu-plugin-grpc @li-keguo
    • [x] shenyu-plugin-sentinel @songyuequan
    • [x] shenyu-plugin-dubbo @dizent

    • [x] shenyu-plugin-waf @zendwang checked
    • [x] shenyu-plugin-websocket @zendwang checked
    • [x] shenyu-plugin-hystrix @isevenluo checked
    • [x] shenyu-plugin-springcloud @choconana checked
    • [x] shenyu-plugin-divide @choconana checked
    • [x] shenyu-plugin-httpclient @dizent checked
    • [x] shenyu-plugin-jwt @songyuequan checked

    • [x] shenyu-plugin-modify-response @songyuequan
    • [x] shenyu-plugin-param-mapping @songyuequan
    status: volunteer wanted 
    opened by songyuequan 36
  • 【Code Clean】Remove warning codes in apache shenyu

    【Code Clean】Remove warning codes in apache shenyu

    Volunteer help

    Hi Community:

    As the functionality of the apache shenyu project becomes more and more perfect.

    Now apache shenyu has 100+ sub-projects and the amount of code is getting bigger and bigger.

    To enhance the quality and readability of the code,and code design.

    The project modules involved in this activity are deliberately launched as follows (code includes test code):

    • [ ] sheyun-admin @prospect167
    • [ ] shenyu-client @qicz
    • [ ] shenyu-common @qinxu2015
    • [ ] shenyu-disruptor @songyuequan
    • [ ] shenyu-examples @li-keguo
    • [ ] shenyu-integrated-test @lxl910128
    • [ ] shenyu-loadbalancer @haibo-duan
    • [ ] shenyu-metrics @6freeair2016
    • [ ] shenyu-plugin @choconana
    • [ ] shenyu-register-center @plutokaito
    • [ ] shenyu-spi @heihei180
    • [ ] shenyu-spring-boot-starter @Cw404
    • [ ] shenyu-sync-data-center @JooKS-me
    • [ ] shenyu-web @LXPWing

    If you are interested in any of the above modules, please reply :“ i want to optimize shenyu-xxx” in this and email :https://lists.apache.org/thread/dr40q6bsrrryn6z19f0d59mor46qwb0s

    And then you can create your own issue and break up the optimization of each module into many small tasks. Before that, I suggest you look at: https://shenyu.apache.org/zh/community/code-suggestions

    Please read the Contribution Guideline before submitting the PR

    status: volunteer wanted level: easy 
    opened by yu199195 32
  • AlibabaDubboServiceBeanListener

    AlibabaDubboServiceBeanListener

    hi, branch: master class: AlibabaDubboServiceBeanListener method: onApplicationEvent env: springboot detail: init AlibabaDubboServiceBeanListener invoke onApplicationEvent Map<String, ServiceBean> serviceBean = contextRefreshedEvent.getApplicationContext().getBeansOfType(ServiceBean.class); serviceBean.size() = 0

    type: bug 
    opened by JemyXiao 31
  • [Vote] Donate Soul to Apache Foundation

    [Vote] Donate Soul to Apache Foundation

    After several days discussion with some Apache members, the draft is almost ready , please vote for donating the soul and soul-dashboard to Apache Foundation. Soul will renamed Yuking!

    The Yuking Proposal:

    Yuking Proposal
    Abstract
    Yuking is a high performance Microservices API gateway in Java ecosystem, compatible with a variety of mainstream framework systems, supports hot plug. Users can write their own plugin meet the current requirement and future needs in a variety of scenarios, especially in large-scale scenes.
    
    Proposal
    The Yuking project already has a large community with many contributors (https://dromara.org/awesome/#contributors). It is also widely adopted by many companies and organizations (https://dromara.org/awesome/#knownusers).
    
    We believe that bringing Yuking into Apache Software Foundation could advance development of a stronger and more diverse open source community.
    
    Dromara submits this proposal to donate Yuking's source codes and all related documentations to Apache Software Foundation. The codes are already under Apache License Version 2.0.
    
    Code base core: https://github.com/dromara/soul/
    Code base dashboard: https://github.com/dromara/soul-dashboard/
    Documentations: https://dromara.org/projects/soul/
    Community: https://dromara.org/awesome/
    Voted on submitting the proposal to the Incubator. Check here:
    
    https://github.com/dromara/soul/issues/1237
    
    Background
    Yuking has been used in production environment, its performance and flexibility allow us to use up very cool with the following features:
    
    Provides plugins such as current limiting, fusing, forwarding, routing monitoring and so on.
    Support HTTP, RESTFul, WebSocket, Dubbo, GRPC, Tars and Spring Cloud Proxy.
    Plug-in hot plug, users can customize the implementations.
    Selectors and rules are dynamically configured for flexible matching.
    Support for cluster deployment.
    Support A/B test and grayscale publishing.
    Rationale
    More than 40 organizations (refer to Who is using Yuking: https://github.com/dromara/soul/issues/68 ) already benefit from running Yuking to make Microservices more easier. More than 40 feature ideas (https://github.com/dromara/soul/issues?q=is%3Aissue+label%3A%22type%3A+new+feature%22+is%3Aclosed) come from Yuking community. 
    
    The rapid growth of Yuking community is empowered by open source. We believe the Apache foundation is a great fit as the long-term home for Yuking, as it provides an established process for community-driven development and decision making by consensus. This is exactly the model we want for future Yuking development.
    
    Current Status
    Meritocracy
    Yuking was incubated in 2017 and open sourced on GitHub in 2018. Once open sourced, Yuking has been quickly adopted by multiple organization. We have set up the PMC and Committer. New contributors are guided and reviewed by existed PMC members. When they are ready, PMC will start a vote to promote him/her to become a member of PMC or Committer. See the details See the details here(https://dromara.org/projects/soul/committer/). Contributions are always welcomed and highly valued.
    
    Community
    Now we have set development teams for Yuking respectively in Dromara.org, didiglobal, PerfMa, YY, and IBM. We hope to grow the base of contributors by inviting all those who offer contributions through The Apache Way. Right now, we make use of GitHub as code hosting as well as for community communication.
    
    Core Developers
    The core developers, including experienced open source developers and team leaders, have formed a group full of diversity.
    
    Yu Xiao. He is the founder of this project, Apache ShardingSphere Committer.
    Jinwei Qin. He is the PMC member of Apache Dubbo and Apache ShardingSphere, the member of Dromara.
    Yonglun Zhang. He is the PMC member of Apache ShardingSphere, the member of Dromara.
    Liming Deng. He is the member of OpenTelemetry and Lettuce, the collaborator of jedis, the member of Dromara.
    Yudong Tang. He is the member of OpenTelemetry, Caffeine maintainer, the member of Dromara.
    Haochao Zhuang. He is the PMC member of Apache SkyWalking, the member of Dromara.
    Alignment
    In the Microservices ecosystem, Yuking is a very popular high performance Microservices API gateway supports many RPC framework including Apache Dubbo. We believe that it will help the further growth of Microservices community by having Yuking and Dubbo aligned within Apache foundation. The alignment is also beneficial to other Apache communities (such as Zookeeper).
    
    Known Risks
    Project Name
    Current project name is Soul, will change it to Yuking after it is accepted by the Incubator.
    
    Orphaned Products
    The risk of the Yuking project being abandoned is minimal. There are at least 40 organizations (JD, didiglobal, PerfMa, YY, CHINA TELECOM, IBM, STATE GRID etc.) are highly incentivized to continue development. Many of these organizations have built critical business applications upon Yuking, and have devoted significant internal infrastructure investment in Yuking.
    
    Inexperience with Open Source
    As mentioned in Core Developers section, the core developers all work for companies that have developed or contributed to many open source projects. There are at least four PMC members from other Apache projects together with members of other famous community.
    
    Therefore, we believe we have enough experience to deal with open source.
    
    Homogenous Developers
    The current core developers work across a variety of organizations including Dromara.org, didiglobal, PerfMa, YY; some individual developers are accepted as core developers of Yuking as well. Yuking has an active community of developers, and we are committed to recruiting additional committers based on their contributions to the project.
    
    Reliance on Salaried Developers
    It is expected that Yuking development will occur on both salaried time and on volunteer time, after hours. The majority of initial committers are paid by their employer to contribute to this project. However, they are all passionate about the project, and we are confident that the project will continue even if no salaried developers contribute to the project. We are committed to recruiting additional committers including non-salaried developers.
    
    Relationships with Other Apache Products
    Yuking is closely integrated with Dubbo, Zookeeper, Curator, Shiro and commons in numerous ways.
    
    Yuking integrates Apache Zookeeper as one of the service registration/discovery mechanisms. Yuking is deeply integrated with Apache Dubbo and supports its protocol.
    
    To some extent, Yuking has overlapping goals with the ASF existing API gateway APISIX, but they are in different ecological niche. APISIX is written by Lua and Perl with technical architecture Nginx + etcd, while Yuking is written by Java. Yuking can be conveniently integrated with the RPC framework in the Java ecosystem.
    
    An Excessive Fascination with the Apache Brand
    We acknowledge the value and reputation that the Apache brand would bring to Yuking. However, our primary interest is in the excellent community provided by Apache Software Foundation, in which all the projects could gain stability for long-term development.
    
    Documentation
    A complete set of Yuking documentations is provided in both English and Simplified Chinese. The project will be renamed to Yuking when migrating.
    
    English: https://dromara.org/projects/soul/overview/
    Chinese: https://dromara.org/zh/projects/soul/overview/
    Initial Source
    The project consists of three distinct codebases: core, dashboard and document. The address of three existed Git repositories are as follows:
    
    https://github.com/dromara/soul
    https://github.com/dromara/soul-dashboard
    https://github.com/dromara/dromara.github.io/tree/master/content/en/projects/soul
    Initial Source and Intellectual Property Submission Plan
    As soon as Yuking is approved to join Apache Incubator, the Initial committers will submit ICLA(s). The code is already licensed under the Apache Software License, version 2.0.
    
    External Dependencies
    As all backend codes dependencies are managed using Apache Maven, none of the external libraries need to be packaged in a source distribution.
    
    Most of dependencies have Apache compatible licenses,and the detail as follows:
    
    Backend Dependencies
    Dependency	License	Comments
    mapstruct	Apache-2.0	
    gson	Apache-2.0	
    okhttp	Apache-2.0	
    
    
    lombok	MIT	
    simpleclient	Apache-2.0	
    simpleclient_httpserver	Apache-2.0	
    simpleclient_hotspot	Apache-2.0	
    dubbo	Apache-2.0	
    sofa-rpc-all	Apache-2.0	
    disruptor	Apache-2.0	
    mybatis-spring-boot-starter	Apache-2.0	
    mysql-connector-java	GPL-2.0	Will be removed, and users who need this library can download it manually.
    druid	Apache-2.0	
    commons-lang3	Apache-2.0	
    guava	Apache-2.0	
    commons-collections4	Apache-2.0	
    reactor-spring	Apache-2.0	
    hessian	Apache-1.1	
    kryo-shaded	BSD-3-Clause	
    protostuff-core	Apache-2.0	
    protostuff-runtime	Apache-2.0	
    zookeeper	Apache-2.0	
    zkclient	Apache-2.0	
    pagehelper	MIT	
    springfox-swagger2	Apache-2.0	
    springfox-swagger-ui	Apache-2.0	
    tars-spring-boot-starter	BSD 3-Clause	
    slf4j-api	MIT	
    jcl-over-slf4j	MIT	
    hamcrest-library	BSD 3-Clause	
    junit	EPL-1.0	
    mockito-core	MIT	
    mockito-inline	MIT	
    spring	Apache-2.0	
    spring-boot	Apache-2.0	
    jetcd-core
    Apache-2.0	
    nacos	Apache-2.0	
    The dashboard UI  dependencies are as follows:
    
    Dashboard UI Dependencies
    Dependency	License	Comments
    stylelint-config-standard	MIT	
    stylelint-config-prettier	MIT	
    stylelint	MIT	
    roadhog-api-doc	MIT	
    roadhog	MIT	
    regenerator-runtime	MIT	
    redbox-react	MIT	
    react-loadable	MIT	
    pro-download	ISC	
    Setprototypeof	ISC	
    prettier	MIT	
    mockjs	MIT	
    lint-staged	MIT	
    husky	MIT	
    gh-pages	MIT	
    eslint-plugin-react	MIT	
    eslint-plugin-markdown	MIT	
    eslint-plugin-jsx-a11y	MIT	
    eslint-plugin-import	MIT	
    eslint-plugin-compat	MIT	
    eslint-plugin-babel	MIT	
    eslint-config-prettier	MIT	
    babel-eslint	MIT	
    babel-plugin-dva-hmr	MIT	
    babel-plugin-import	MIT	
    babel-plugin-module-resolver	MIT	
    babel-plugin-transform-decorators-legacy	MIT	
    cross-env	MIT	
    cross-port-killer	MIT	
    enzyme	MIT	
    eslint	MIT	
    eslint-config-airbnb	MIT	
    Url-polyfill	MIT	
    Redux-logger	MIT	
    react-resizable	MIT	
    react-intl-universal	BSD 3-Clause	
    react-fittext	MIT	
    react-dom	MIT	
    react-container-query	MIT	
    react-document-title	MIT	
    react	MIT	
    qs	BSD 3-Clause	
    prop-types	MIT	
    path-to-regexp	MIT	
    omit	MIT	
    babel	MIT	
    antd	MIT	
    classnames	MIT	
    dayjs	MIT	
    dva	MIT	
    dva-loading	MIT	
    enquire-js	MIT	
    lodash	MIT	
    Required Resources
    Mailing lists
    yuking-dev: for development discussions
    yuking-private: for PPMC discussions
    yuking-notifications: for user notifications, and notifications from GitHub
    Git Repositories:
    https://github.com/apache/incubator-yuking
    https://github.com/apache/incubator-yuking-dashboard
    https://github.com/apache/incubator-yuking-website
    Issue Tracking
    The community would like to continue using GitHub Issues.
    
    Initial Committers
    Yu Xiao <[email protected]>
    Jinwei Qin <[email protected]>
    Yonglun Zhang <[email protected]>
    Liming Deng <[email protected]>
    Yudong Tang <[email protected]>
    Lei Zhang <[email protected]>
    Bin Chen <[email protected]>
    Haochao Zhuang <[email protected]>
    Jianming Ding <[email protected]>
    Zhenbing Feng <[email protected]>
    Affiliations
    JD TECH: Yu Xiao, Yonglun Zhang
    PerfMa: Yudong Tang
    HelloBike: Lei Zhang
    Shein: Xiaofeng Huang
    didiglobal: Ziqiang Liang
    YY: Haochao Zhuang
    IBM: Ze Yang
    Start-ups: Liming Deng, Bin Chen, Jianming Ding, Zhenbing Feng
    Sponsors
    Champion
    Willem Ning Jiang (ningjiang at apache dot org)
    Nominated Mentors
    Willem Ning Jiang (ningjiang at apache dot org)
    Jincheng Sun (jincheng at apache dot org)
    Duo Zhang (zhangduo at apache dot org)
    Sponsoring Entity
    We are expecting the Apache Incubator could sponsor this project.
    
    

    The vote is for All Initial Committers:

    @yu199195 @tuohai666 @kimmking @dengliming @tydhot @SaberSola @nuo-promise @fengzhenbing @prFor @dmsolr Voters can either respond "agree, yes, +1", "disagree, no, -1", or "abstain".

    opened by yu199195 29
  • [Vote] Donate Soul to Apache Foundation

    [Vote] Donate Soul to Apache Foundation

    After several days discussion with some Apache members, the draft is almost ready , please vote for donating the soul and soul-dashboard to Apache Foundation. soul will renamed Yuking!

    the YukingProposal is :

    Yuking Proposal

    Abstract

    Yuking is a high performance Microservices API gateway in Java ecosystem, compatible with a variety of mainstream framework systems, supports hot plug. Users can write their own plugin meet the current requirement and future needs in a variety of scenarios, especially in large-scale scenes.

    Proposal

    The Yuking project already has a large community with many contributors (https://dromara.org/awesome/#contributors). It is also widely adopted by many companies and organizations (https://dromara.org/awesome/#knownusers).

    We believe that bringing Yuking into Apache Software Foundation could advance development of a stronger and more diverse open source community.

    Dromara submits this proposal to donate Yuking's source codes and all related documentations to Apache Software Foundation. The codes are already under Apache License Version 2.0.

    • Code base core: https://github.com/dromara/soul/
    • Code base dashboard: https://github.com/dromara/soul-dashboard/
    • Documentations: https://dromara.org/projects/soul/
    • Community: https://dromara.org/awesome/

    Background

    Yuking has been used in production environment, its performance and flexibility allow us to use up very cool with the following features:

    • Provides plugins such as current limiting, fusing, forwarding, routing monitoring and so on.
    • Support HTTP, RESTFul, WebSocket, Dubbo, GRPC, Tars and Spring Cloud Proxy.
    • Plug-in hot plug, users can customize the implementations.
    • Selectors and rules are dynamically configured for flexible matching.
    • Support for cluster deployment.
    • Support A/B test and grayscale publishing.

    Rationale

    More than 40 organizations (refer to Who is using Yuking: https://github.com/dromara/soul/issues/68 ) already benefit from running Yuking to make Microservices more easier. More than 40 feature ideas (https://github.com/dromara/soul/issues?q=is%3Aissue+label%3A%22type%3A+new+feature%22+is%3Aclosed) come from Yuking community.

    The rapid growth of Yuking community is empowered by open source. We believe the Apache foundation is a great fit as the long-term home for Yuking, as it provides an established process for community-driven development and decision making by consensus. This is exactly the model we want for future Yuking development.

    Current Status Meritocracy

    Yuking was incubated in 2017 and open sourced on GitHub in 2018. Once open sourced, Yuking has been quickly adopted by multiple organization. We have set up the PMC and Committer. New contributors are guided and reviewed by existed PMC members. When they are ready, PMC will start a vote to promote him/her to become a member of PMC or Committer. See the details See the details here(https://dromara.org/projects/soul/committer/). Contributions are always welcomed and highly valued.

    Community

    Now we have set development teams for Yuking respectively in Dromara.org, didiglobal, PerfMa, YY, and IBM. We hope to grow the base of contributors by inviting all those who offer contributions through The Apache Way. Right now, we make use of GitHub as code hosting as well as for community communication.

    Core Developers

    The core developers, including experienced open source developers and team leaders, have formed a group full of diversity.

    • Yu Xiao. He is the founder of this project, Apache ShardingSphere Committer.
    • Jinwei Qin. He is the PMC member of Apache Dubbo and Apache ShardingSphere, the member of Dromara.
    • Yonglun Zhang. He is the PMC member of Apache ShardingSphere, the member of Dromara.
    • Liming Deng. He is the member of OpenTelemetry and Lettuce, the collaborator of jedis, the member of Dromara.
    • Yudong Tang. He is the member of OpenTelemetry, Caffeine maintainer, the member of Dromara.
    • Haochao Zhuang. He is the PMC member of Apache SkyWalking, the member of Dromara.

    Alignment

    In the Microservices ecosystem, Yuking is a very popular high performance Microservices API gateway supports many RPC framework including Apache Dubbo. We believe that it will help the further growth of Microservices community by having Yuking and Dubbo aligned within Apache foundation. The alignment is also beneficial to other Apache communities (such as Zookeeper).

    Known Risks

    Project Name

    Current project name is Soul, will change it to Yuking after it is accepted by the Incubator.

    Orphaned Products

    The risk of the Yuking project being abandoned is minimal. There are at least 40 organizations (JD, didiglobal, PerfMa, YY, CHINA TELECOM, IBM, STATE GRID etc.) are highly incentivized to continue development. Many of these organizations have built critical business applications upon Yuking, and have devoted significant internal infrastructure investment in Yuking.

    Inexperience with Open Source

    As mentioned in Core Developers section, the core developers all work for companies that have developed or contributed to many open source projects. There are at least four PMC members from other Apache projects together with members of other famous community.

    Therefore, we believe we have enough experience to deal with open source.

    Homogenous Developers

    The current core developers work across a variety of organizations including Dromara.org, didiglobal, PerfMa, YY; some individual developers are accepted as core developers of Yuking as well. Yuking has an active community of developers, and we are committed to recruiting additional committers based on their contributions to the project.

    Reliance on Salaried Developers

    It is expected that Yuking development will occur on both salaried time and on volunteer time, after hours. The majority of initial committers are paid by their employer to contribute to this project. However, they are all passionate about the project, and we are confident that the project will continue even if no salaried developers contribute to the project. We are committed to recruiting additional committers including non-salaried developers.

    Relationships with Other Apache Products

    Yuking is closely integrated with Dubbo, Zookeeper, Curator, Shiro and commons in numerous ways.

    Yuking integrates Apache Zookeeper as one of the service registration/discovery mechanisms. Yuking is deeply integrated with Apache Dubbo and supports its protocol.

    To some extent, Yuking has overlapping goals with the ASF existing API gateway APISIX, but they are in different ecological niche. APISIX is written by Lua and Perl with technical architecture Nginx + etcd, while Yuking is written by Java. Yuking can be conveniently integrated with the RPC framework in the Java ecosystem.

    An Excessive Fascination with the Apache Brand

    We acknowledge the value and reputation that the Apache brand would bring to Yuking. However, our primary interest is in the excellent community provided by Apache Software Foundation, in which all the projects could gain stability for long-term development.

    Documentation

    A complete set of Yuking documentations is provided in both English and Simplified Chinese. The project will be renamed to Yuking when migrating.

    • English: https://dromara.org/projects/soul/overview/
    • Chinese: https://dromara.org/zh/projects/soul/overview/

    Initial Source

    The project consists of three distinct codebases: core, dashboard and document. The address of three existed Git repositories are as follows:

    • https://github.com/dromara/soul
    • https://github.com/dromara/soul-dashboard
    • https://github.com/dromara/dromara.github.io/tree/master/content/en/projects/soul

    Initial Source and Intellectual Property Submission Plan

    As soon as Yuking is approved to join Apache Incubator, the Initial committers will submit ICLA(s). The code is already licensed under the Apache Software License, version 2.0.

    External Dependencies

    As all backend codes dependencies are managed using Apache Maven, none of the external libraries need to be packaged in a source distribution.

    Most of dependencies have Apache compatible licenses,and the detail as follows:

    • Backend Dependencies

    | Dependency: | License | Comments | |:-------------------- |:-------------- |:---------------------------------------- | | mapstruct | Apache-2.0 | | | gson | Apache-2.0 | | | okhttp | Apache-2.0 | | | lombok | MIT | | | simpleclient | Apache-2.0 | | | simpleclient_httpserver| Apache-2.0 | | | simpleclient_hotspot | Apache-2.0 | | | dubbo | Apache-2.0 | | | sofa-rpc-all | Apache-2.0 | | | disruptor | Apache-2.0 | | | mybatis-spring-boot-starter | Apache-2.0 | | | mysql-connector-java | GPL-2.0 | Will be removed, and users who need this library can download it manually. | | druid | Apache-2.0 | | | commons-lang3 | Apache-2.0 | | | commons-collections4 | Apache-2.0 | | | reactor-spring | Apache-2.0 | | | hessian | Apache-1.1 | | | kryo-shaded | BSD-3-Clause | | | protostuff-core | BSD-3-Clause | | | protostuff-runtime | BSD-3-Clause | | | protostuff-runtime | BSD-3-Clause | | | zookeeper |Apache-2.0 | | | zkclient | Apache-2.0 | | | pagehelper |MIT | | | springfox-swagger2 |Apache-2.0 | | | springfox-swagger-ui | Apache-2.0 | | | tars-spring-boot-starter | BSD-3-Clause | | | slf4j-api |MIT | | | jcl-over-slf4j |MIT | | | hamcrest-library | BSD-3-Clause | | | junit | EPL-1.0 | | | mockito-core | MIT | | | mockito-inline | MIT | | | spring | Apache-2.0 | | | spring-boot | Apache-2.0 | | | jetcd-core | Apache-2.0 | | | nacos | Apache-2.0 | |

    • The dashboard UI dependencies are as follows:

    | Dependency | License | Comments | |:-------------------- |:-------------- |:---------------------------------------- | | stylelint-config-standard | MIT | | | stylelint-config-prettier | MIT | | | stylelint | MIT | | | roadhog-api-doc | MIT | | | roadhog | MIT | | | regenerator-runtime | MIT | | | redbox-react | MIT | | | react-loadable | MIT | | | pro-download | ISC | | | Setprototypeof | ISC | | | prettier | MIT | | | prettier | MIT | | | lint-staged | MIT | | | gh-pages | MIT | | | eslint-plugin-react | MIT | | | eslint-plugin-markdown | MIT | | | eslint-plugin-jsx-a11y | MIT | | | eslint-plugin-import | MIT | | | eslint-plugin-compat | MIT | | | eslint-plugin-babel | MIT | | | eslint-config-prettier | MIT | | | babel-eslint | MIT | | | babel-plugin-dva-hmr | MIT | | | babel-plugin-import | MIT | | | babel-plugin-module-resolver | MIT | | | babel-plugin-transform-decorators-legacy | MIT | | | cross-env | MIT | | | cross-port-killer | MIT | | | enzyme | MIT | | | eslint | MIT | | | eslint-config-airbnb | MIT | | | Url-polyfill | MIT | | | Redux-logger | MIT | | | react-resizable | MIT | | | react-intl-universal | BSD 3-Clause | | | react-fittext | MIT | | | react-dom | MIT | | | react-container-query | MIT | | | react-document-title | MIT | | | react | MIT | | | qs | BSD 3-Clause | | | prop-types | MIT | | | path-to-regexp | MIT | | | omit | MIT | | | babel | MIT | | | antd | MIT | | | classnames | MIT | | | dayjs | MIT | | | dva | MIT | | | dva-loading | MIT | | | enquire-js | MIT | | | lodash | MIT | |

    Required Resources

    Mailing lists

    • yuking-dev: for development discussions
    • yuking-private: for PPMC discussions
    • yuking-notifications: for user notifications, and notifications from GitHub

    Git Repositories:

    • https://github.com/apache/incubator-yuking
    • https://github.com/apache/incubator-yuking-dashboard
    • https://github.com/apache/incubator-yuking-website

    Issue Tracking

    The community would like to continue using GitHub Issues.

    Initial Committers

    Yu Xiao [email protected] Jinwei Qin [email protected] Yonglun Zhang [email protected] Liming Deng [email protected] Yudong Tang [email protected] Lei Zhang [email protected] Bin Chen [email protected] Haochao Zhuang [email protected] Jianming Ding [email protected] Zhenbing Feng [email protected]

    Affiliations

    JD TECH: Yu Xiao, Yonglun Zhang PerfMa: Yudong Tang HelloBike: Lei Zhang Shein: Xiaofeng Huang didiglobal: Ziqiang Liang YY: Haochao Zhuang IBM: Ze Yang Start-ups: Liming Deng, Bin Chen, Jianming Ding, Zhenbing Feng

    Sponsors

    Champion

    • Willem Ning Jiang (ningjiang at apache dot org)

    Nominated Mentors

    • Willem Ning Jiang (ningjiang at apache dot org)
    • Jincheng Sun (jincheng at apache dot org)
    • Duo Zhang (zhangduo at apache dot org)

    Sponsoring Entity

    We are expecting the Apache Incubator could sponsor this project.

    The vote is for All Initial Committers:

    @yu199195 @tuohai666 @kimmking @dengliming @tydhot @SaberSola @nuo-promise @fengzhenbing @prFor @dmsolr Voters can either respond "agree, yes, +1", "disagree, no, -1", or "abstain".

    opened by yu199195 26
  • I have a problem with sofa.  Please help me to have a look

    I have a problem with sofa. Please help me to have a look

    Question

    I used the local startup method to test the interface of sofa. The following errors occurred. The registry used was zookeeper and the example provided on the official website was used

    Error log printed by the gateway when called

    2022-05-31 15:34:38 [boundedElastic-3] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - sofa selector success match , selector name :/sofa 2022-05-31 15:34:38 [boundedElastic-3] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - sofa rule success match , rule name :/sofa/findAll 2022-05-31 15:34:38 [boundedElastic-3] ERROR org.apache.shenyu.web.handler.GlobalErrorHandler - [b54a2486] Resolved [SofaRouteException: RPC-020060001: 没有获得服务[org.apache.shenyu.examples.sofa.api.service.SofaSingleParamService:1.0]的调用地址,请检查服务是否已经推送 ] for HTTP GET /sofa/findAll Information on zookeeper image

    type: bug type: question 
    opened by Summary-wcj 23
  • Spring Cloud - Wrong context path

    Spring Cloud - Wrong context path

    Describe the bug

    It seems that spring cloud dependence failed to register context path correctly, caused the actual path that shenyu visit is very strange.

    Environment

    • ShenYu version(s): 2.4.0

    Steps to reproduce

    1. Add dependence to my service: implementation("org.apache.shenyu:shenyu-spring-boot-starter-client-springcloud:${Const.shenYuVersion}")
    2. Add properties:
    shenyu:
      client:
        registerType: nacos
        props:
          contextPath: "/"
          nacosNameSpace: Shenyu
          isFull: false
    
    1. Add annotation to class and function.
    @RestController
    @ShenyuSpringCloudClient(path = "/users")
    internal class UserController(
        private val userService: UserService,
        private val watchfacePermissionService: WatchfacePermissionService,
    ) : IUserController {
    
        @ShenyuSpringCloudClient(path = "/hello")
        override fun hello(): String {
            return "Hello"
        }
    }
    

    Then, send a request to shenyu: http://localhost:7000/users/hello.

    Expected behavior

    Shenyu should redirect to http://xxx.xxx.xx.xx:7010/users/hello.

    But the actual is http://192.168.50.20:7010ers/hello.


    I checked the context_path's rules, there is a newly added:

    After several attempts, I really can't understand the specific behavior of this plugin —— No matter what I fill in, I can't achieve the expected behavior.

    Finally, I turned off the plugin (or delete this rule) and everything was fine.


    So, does this tool misunderstand the path I set? Or are there other approch for this usecase that context_path is not required?

    By the way, I have conformed that this attribute can not be null or empty, otherwise it will throw a Index out of bounds exception due to this code:

    // NacosClientRegisterRepository#persistInterface()
    
    @Override
    public void persistInterface(final MetaDataRegisterDTO metadata) {
        String contextPath = metadata.getContextPath().substring(1);
        // ...
    }
    
    

    Debug logs

    INFO 46443 --- [ctor-http-nio-3] o.a.s.plugin.base.AbstractShenyuPlugin   : context_path selector success match , selector name :/context-path/
    INFO 46443 --- [ctor-http-nio-3] o.a.s.plugin.base.AbstractShenyuPlugin   : context_path rule success match , rule name :/context-path/
    INFO 46443 --- [ctor-http-nio-3] o.a.s.plugin.base.AbstractShenyuPlugin   : springCloud selector success match , selector name :/
    INFO 46443 --- [ctor-http-nio-3] o.a.s.plugin.base.AbstractShenyuPlugin   : springCloud rule success match , rule name ://users/**
    INFO 46443 --- [ctor-http-nio-3] o.a.s.plugin.httpclient.WebClientPlugin  : The request urlPath is http://192.168.50.20:7010ers/hello, retryTimes is 0
    
    
    type: question 
    opened by ichenhe 23
  •  degrad‘s fallbackUri of sentinel cant not work,but flow's fallbackUri can work.

    degrad‘s fallbackUri of sentinel cant not work,but flow's fallbackUri can work.

    Is there an existing issue for this?

    • [X] I have searched the existing issues

    Current Behavior

    I'm using the fusing and current limiting functions. I found some problems. Can you help me ?

    Expected Behavior

    the fallbackUri of flow and degrade all can work

    Steps To Reproduce

    1:i code this @RestController @RequestMapping("/order") @ShenyuSpringCloudClient(path = "/order/**") public class OrderController {

    /**
     * flow
     * @return
     */
    @GetMapping("/list")
    public String list(){
        return "order-list...";
    }
    
    /**
     * degrade
     * @return
     */
    @GetMapping("/exception")
    public String exception(){
      throw new RuntimeException("exception");
    }
    
    /**
     * degrade
     * @return
     */
    @GetMapping("/error")
    public String error(){
        int i = 0;
        return "" + 10/i;
    }
    
    /**
     * fallback
     * @return
     */
    @GetMapping("/fallbackOfList")
    public String fallbackOfList(){
        return "order-list-fallback...";
    }
    

    }

    2:the sentinel selector and rules: image

    image

    3:ask error or exception interface server: image

    image

    image

    Environment

    ShenYu version(s):2.5.0
    

    Debug logs

    2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - contextPath selector success match , selector name :/order-base 2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - contextPath rule success match , rule name :/order-base 2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - sentinel selector success match , selector name :/order-base/order/** 2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - sentinel rule success match , rule name :/order-base/order/** 2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - springCloud selector success match , selector name :/order-base 2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.base.AbstractShenyuPlugin - springCloud rule success match , rule name :/order-base/order/** 2022-09-16 16:30:30 [parallel-4] INFO org.apache.shenyu.plugin.httpclient.AbstractHttpClientPlugin - The request urlPath is null://10.167.52.192:8081/order/error, retryTimes is 0, retryStrategy is current 2022-09-16 16:30:31 [shenyu-netty-kqueue-3] ERROR org.apache.shenyu.web.handler.GlobalErrorHandler - handle error: [b6b27f1d-716] Resolved [UnsupportedOperationException: null] for HTTP GET /order-base/order/error java.lang.UnsupportedOperationException: null at org.springframework.http.ReadOnlyHttpHeaders.set(ReadOnlyHttpHeaders.java:106) Suppressed: org.apache.shenyu.plugin.sentinel.SentinelPlugin$SentinelFallbackException: 500 INTERNAL_SERVER_ERROR at org.apache.shenyu.plugin.sentinel.SentinelPlugin.lambda$doExecute$0(SentinelPlugin.java:60) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:289) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89) at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:230) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:196) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48) at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717) at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272) at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352) at io.netty.channel.kqueue.AbstractKQueueChannel.doWriteBytes(AbstractKQueueChannel.java:281) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.writeBytes(AbstractKQueueStreamChannel.java:111) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWriteSingle(AbstractKQueueStreamChannel.java:323) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWrite(AbstractKQueueStreamChannel.java:281) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:931) at io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe.flush0(AbstractKQueueChannel.java:507) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895) at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531) at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125) at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765) at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071) at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) at io.netty.channel.kqueue.KQueueEventLoop.run(KQueueEventLoop.java:293) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): *__checkpoint ⇢ org.apache.shenyu.web.configuration.ErrorHandlerConfiguration$1 [DefaultWebFilterChain] *__checkpoint ⇢ org.apache.shenyu.web.filter.FileSizeFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.apache.shenyu.web.filter.CrossFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ HTTP GET "/order-base/order/error" [ExceptionHandlingWebHandler] Original Stack Trace: at org.springframework.http.ReadOnlyHttpHeaders.set(ReadOnlyHttpHeaders.java:106) at org.springframework.http.HttpHeaders.setOrRemove(HttpHeaders.java:1636) at org.springframework.http.HttpHeaders.setLocation(HttpHeaders.java:1318) at org.apache.shenyu.plugin.base.fallback.FallbackHandler.fallback(FallbackHandler.java:74) at org.apache.shenyu.plugin.sentinel.SentinelPlugin.lambda$doExecute$1(SentinelPlugin.java:63) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) at com.alibaba.csp.sentinel.adapter.reactor.SentinelReactorSubscriber.hookOnError(SentinelReactorSubscriber.java:153) at com.alibaba.csp.sentinel.adapter.reactor.InheritableBaseSubscriber.onError(InheritableBaseSubscriber.java:176) at com.alibaba.csp.sentinel.adapter.reactor.SentinelReactorSubscriber.onError(SentinelReactorSubscriber.java:37) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89) at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:230) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:196) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48) at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717) at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272) at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352) at io.netty.channel.kqueue.AbstractKQueueChannel.doWriteBytes(AbstractKQueueChannel.java:281) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.writeBytes(AbstractKQueueStreamChannel.java:111) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWriteSingle(AbstractKQueueStreamChannel.java:323) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWrite(AbstractKQueueStreamChannel.java:281) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:931) at io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe.flush0(AbstractKQueueChannel.java:507) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895) at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531) at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125) at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765) at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071) at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) at io.netty.channel.kqueue.KQueueEventLoop.run(KQueueEventLoop.java:293) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) 2022-09-16 16:30:31 [shenyu-netty-kqueue-3] ERROR org.springframework.web.server.adapter.HttpWebHandlerAdapter - [b6b27f1d-716] Error [java.lang.UnsupportedOperationException] for HTTP GET "/order-base/order/error", but ServerHttpResponse already committed (500 INTERNAL_SERVER_ERROR) 2022-09-16 16:30:31 [shenyu-netty-kqueue-3] ERROR reactor.netty.http.server.HttpServerOperations - [b6b27f1d-1, L:/0:0:0:0:0:0:0:1%0:9195 - R:/0:0:0:0:0:0:0:1%0:63900] Error finishing response. Closing connection java.lang.UnsupportedOperationException: null at org.springframework.http.ReadOnlyHttpHeaders.set(ReadOnlyHttpHeaders.java:106) at org.springframework.http.HttpHeaders.setContentType(HttpHeaders.java:977) at org.apache.shenyu.plugin.api.utils.WebFluxResultUtils.result(WebFluxResultUtils.java:64) at org.apache.shenyu.web.handler.GlobalErrorHandler.handle(GlobalErrorHandler.java:59) at org.springframework.web.server.handler.ExceptionHandlingWebHandler.lambda$handle$0(ExceptionHandlingWebHandler.java:77) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) at reactor.core.publisher.Operators.error(Operators.java:198) at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4400) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.Operators.error(Operators.java:198) at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4400) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222) at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:195) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:192) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:259) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:192) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:259) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172) at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:2063) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onError(MonoIgnoreThen.java:278) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) at reactor.core.publisher.Operators.error(Operators.java:198) at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4400) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:2063) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:100) at com.alibaba.csp.sentinel.adapter.reactor.SentinelReactorSubscriber.hookOnError(SentinelReactorSubscriber.java:153) at com.alibaba.csp.sentinel.adapter.reactor.InheritableBaseSubscriber.onError(InheritableBaseSubscriber.java:176) at com.alibaba.csp.sentinel.adapter.reactor.SentinelReactorSubscriber.onError(SentinelReactorSubscriber.java:37) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89) at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:230) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:196) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48) at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717) at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272) at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352) at io.netty.channel.kqueue.AbstractKQueueChannel.doWriteBytes(AbstractKQueueChannel.java:281) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.writeBytes(AbstractKQueueStreamChannel.java:111) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWriteSingle(AbstractKQueueStreamChannel.java:323) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWrite(AbstractKQueueStreamChannel.java:281) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:931) at io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe.flush0(AbstractKQueueChannel.java:507) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895) at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531) at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125) at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765) at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071) at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) at io.netty.channel.kqueue.KQueueEventLoop.run(KQueueEventLoop.java:293) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Suppressed: java.lang.UnsupportedOperationException: null at org.springframework.http.ReadOnlyHttpHeaders.set(ReadOnlyHttpHeaders.java:106) Suppressed: org.apache.shenyu.plugin.sentinel.SentinelPlugin$SentinelFallbackException: 500 INTERNAL_SERVER_ERROR at org.apache.shenyu.plugin.sentinel.SentinelPlugin.lambda$doExecute$0(SentinelPlugin.java:60) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:289) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89) at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:230) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:196) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48) at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717) at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272) at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352) at io.netty.channel.kqueue.AbstractKQueueChannel.doWriteBytes(AbstractKQueueChannel.java:281) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.writeBytes(AbstractKQueueStreamChannel.java:111) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWriteSingle(AbstractKQueueStreamChannel.java:323) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWrite(AbstractKQueueStreamChannel.java:281) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:931) at io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe.flush0(AbstractKQueueChannel.java:507) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895) at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531) at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125) at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765) at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071) at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) at io.netty.channel.kqueue.KQueueEventLoop.run(KQueueEventLoop.java:293) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): *__checkpoint ⇢ org.apache.shenyu.web.configuration.ErrorHandlerConfiguration$1 [DefaultWebFilterChain] *__checkpoint ⇢ org.apache.shenyu.web.filter.FileSizeFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.apache.shenyu.web.filter.CrossFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ HTTP GET "/order-base/order/error" [ExceptionHandlingWebHandler] Original Stack Trace: at org.springframework.http.ReadOnlyHttpHeaders.set(ReadOnlyHttpHeaders.java:106) at org.springframework.http.HttpHeaders.setOrRemove(HttpHeaders.java:1636) at org.springframework.http.HttpHeaders.setLocation(HttpHeaders.java:1318) at org.apache.shenyu.plugin.base.fallback.FallbackHandler.fallback(FallbackHandler.java:74) at org.apache.shenyu.plugin.sentinel.SentinelPlugin.lambda$doExecute$1(SentinelPlugin.java:63) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) at com.alibaba.csp.sentinel.adapter.reactor.SentinelReactorSubscriber.hookOnError(SentinelReactorSubscriber.java:153) at com.alibaba.csp.sentinel.adapter.reactor.InheritableBaseSubscriber.onError(InheritableBaseSubscriber.java:176) at com.alibaba.csp.sentinel.adapter.reactor.SentinelReactorSubscriber.onError(SentinelReactorSubscriber.java:37) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:292) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onComplete(MonoIgnoreElements.java:89) at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:230) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onComplete(FluxContextWrite.java:126) at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:196) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:268) at reactor.netty.FutureMono$FutureSubscription.operationComplete(FutureMono.java:196) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48) at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717) at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272) at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352) at io.netty.channel.kqueue.AbstractKQueueChannel.doWriteBytes(AbstractKQueueChannel.java:281) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.writeBytes(AbstractKQueueStreamChannel.java:111) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWriteSingle(AbstractKQueueStreamChannel.java:323) at io.netty.channel.kqueue.AbstractKQueueStreamChannel.doWrite(AbstractKQueueStreamChannel.java:281) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:931) at io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe.flush0(AbstractKQueueChannel.java:507) at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:895) at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.flush(CombinedChannelDuplexHandler.java:531) at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:125) at io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:356) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742) at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728) at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127) at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750) at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765) at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071) at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) at io.netty.channel.kqueue.KQueueEventLoop.run(KQueueEventLoop.java:293) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748)

    Anything else?

    When the point is not interrupted, it will never enter the fallback. When I interrupt the point debugging, I can occasionally correctly return the expected fallback.

    There are many unexpected returns. I think there must be something wrong

    type: bug 
    opened by hlcen66 22
  • [ISSUE #4208] Refactored Sign-plugin

    [ISSUE #4208] Refactored Sign-plugin

    Implmented #4208

    Make sure that:

    • [x] You have read the contribution guidelines.
    • [x] You submit test cases (unit or integration tests) that back your changes.
    • [x] Your local test passed ./mvnw clean install -Dmaven.javadoc.skip=true.
    opened by tian-pengfei 1
  • [ISSUE #3450]Add spring boot starter plugin brpc&admin

    [ISSUE #3450]Add spring boot starter plugin brpc&admin

    #3450

    Make sure that:

    • [x] You have read the contribution guidelines.
    • [x] You submit test cases (unit or integration tests) that back your changes.
    • [x] Your local test passed ./mvnw clean install -Dmaven.javadoc.skip=true.
    opened by MichaelDeSteven 1
  • websocket plugin data is empty

    websocket plugin data is empty

    Question

    shenyu version-2.5.0

    shenyu Admin and gateway data sync by nacos

    when i run websocket example project that selector data is empty in proxy of pluginList.

    In the picture, the data is inserted by myself image image image

    this is a result by postman. image

    this is config of websocket server image

    error infomation

    2023-01-09 15:07:32 [parallel-5] INFO  org.apache.shenyu.plugin.base.AbstractShenyuPlugin - websocket selector success match , selector name :/ws-annotation
    2023-01-09 15:07:32 [parallel-5] INFO  org.apache.shenyu.plugin.base.AbstractShenyuPlugin - websocket rule success match , rule name :/myWs
    2023-01-09 15:07:32 [parallel-5] INFO  org.apache.shenyu.plugin.websocket.WebSocketPlugin - you websocket urlPath is :ws://172.1.11.35:8001/ws-annotation/myWs
    2023-01-09 15:07:32 [reactor-http-nio-9] WARN  reactor.netty.http.client.HttpClientConnect - [8bf5dd8b-1, L:/172.1.11.35:19834 - R:/172.1.11.35:8001] The connection observed an error
    io.netty.handler.codec.http.websocketx.WebSocketClientHandshakeException: Invalid handshake response getStatus: 404 
    	at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker13.verify(WebSocketClientHandshaker13.java:272)
    	at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker.finishHandshake(WebSocketClientHandshaker.java:309)
    	at reactor.netty.http.client.WebsocketClientOperations.onInboundNext(WebsocketClientOperations.java:116)
    	at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
    	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
    	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
    	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
    	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:748)
    2023-01-09 15:07:32 [reactor-http-nio-9] WARN  reactor.netty.channel.FluxReceive - [8bf5dd8b-1, L:/172.1.11.35:19834 ! R:/172.1.11.35:8001] An exception has been observed post termination, use DEBUG level to see the full stack: io.netty.handler.codec.http.websocketx.WebSocketClientHandshakeException: Connection prematurely closed BEFORE opening handshake is complete.
    
    
    type: question 
    opened by Layfolk-zcy 0
  • [BUG]UpstreamCheckService#check error

    [BUG]UpstreamCheckService#check error

    Is there an existing issue for this?

    • [X] I have searched the existing issues

    Current Behavior

    PENDING_SYNC was not set when checking upstream successfully, resulting in unable to update the handler of selector

    Expected Behavior

    private void check(final String selectorId, final List upstreamList) { List successList = Lists.newArrayListWithCapacity(upstreamList.size()); for (CommonUpstream commonUpstream : upstreamList) { final boolean pass = UpstreamCheckUtils.checkUrl(commonUpstream.getUpstreamUrl()); if (pass) { if (!commonUpstream.isStatus()) { commonUpstream.setTimestamp(System.currentTimeMillis()); commonUpstream.setStatus(true); // add PENDING_SYNC PENDING_SYNC.add(commonUpstream.hashCode()); LOG.info("UpstreamCacheManager check success the url: {}, host: {} ", commonUpstream.getUpstreamUrl(), commonUpstream.getUpstreamHost()); } successList.add(commonUpstream); ................

    Steps To Reproduce

    No response

    Environment

    ShenYu version(s):2.5.0
    

    Debug logs

    No response

    Anything else?

    No response

    type: bug 
    opened by liukun321 0
  • [ISSUES#4249]perfect plug-loggingClickHouse & refactor code

    [ISSUES#4249]perfect plug-loggingClickHouse & refactor code

    about https://github.com/apache/shenyu/issues/4249

    Make sure that:

    • [x] You have read the contribution guidelines.
    • [x] You submit test cases (unit or integration tests) that back your changes.
    • [x] Your local test passed ./mvnw clean install -Dmaven.javadoc.skip=true.
    opened by misaya295 1
Releases(v2.5.0)
  • v2.5.0(Aug 25, 2022)

    2.5.0

    New Features

    1. Add logging-aliyun-sls plugin
    2. Add mock plugin
    3. Add logging-es plugin
    4. Add logging-rocketmq plugin
    5. Add logging-kafka plugin
    6. Add custom message writer in response plugin
    7. Add record log in admin
    8. Add apache dubbo http
    9. Add nacos register
    10. add the logic of annotation on the splicing class for sofa client
    11. Add the logic of annotation on the splicing class for motan client
    12. Add netty http server parameters
    13. Add the logic of annotation on the splicing class for apache dubbo client
    14. Add alert module
    15. Add support configurable timeout for MotanPlugin
    16. Add api document
    17. Add user permissions Exclude admin
    18. Add springBoot upgrade to 2.6.8
    19. Add support regsiter instance to consul
    20. Add admin Support oracle database

    API Changes

    Enhancement

    1. Enhancement cache pluign
    2. Enhancement divide plugin

    Refactor

    1. Refactor spring cloud loadbalancer
    2. Refactor thread pool
    3. Refactor max memory config logic
    4. Refactor cors logic
    5. Refactor selector match
    6. Refactor fixed and elastic connection provider pool
    7. Refactor uri register
    8. Refactor zk client delete logic
    9. Refactor IpUtils
    10. Refactor result wrap
    11. Refactor app auth
    12. Refactor http client
    13. Refactor proxy and webclient remove host
    14. Refactor shared thread pool

    Bug Fix

    1. Fix divide has nullpointerexception
    2. Fix body maxInMemorySize
    3. Fix admin delay update handle in selector
    4. Fix register-client loop error
    5. Fix the error of combination plugin
    6. Fix sofa and websocket client lossless registration
    7. Fix grpc client lossless registration
    8. Fix springcloud client lossless registration
    9. Fix spring cloud dubbo example
    10. Fix NPE repair of admin module caused by spring MVC example synchronization
    11. Fix curator version incompatible in bootstrap
    12. Fix hiden logic bug
    13. Fix failure to load local plugins
    14. Fix pg script error
    15. Fix hystrix-plugin tests failure
    16. Fix client registration by consul only register 1 metadata
    17. Fix websocket datasync can chose allow origin to avoid CSRF
    Source code(tar.gz)
    Source code(zip)
  • v2.4.3(Apr 14, 2022)

    2.4.3

    New Features

    1. Add http register client retry.
    2. Support octet-stream context-type.
    3. Support redirecting to URIs outside of bootstrap and refactoring code.
    4. Add local API authorization.
    5. Support config dubbo consumer pool.
    6. Support DividePlugin failover retry.
    7. Support websocket client configuration.
    8. Support config netty thread pool in HttpClient.
    9. Support MemoryLimitedLinkedBlockingQueue.
    10. Support alibaba dubbo plugin shared thread pool.
    11. Support grpc plugin shared thread pool.
    12. Add Metrics Plugin.
    13. Add Cache Plugin.
    14. Add logging rocketmq plugin.

    API Changes

    Enhancement

    1. Test combination of Param mapping, Rewrite plugin,
    2. Test combination of Param mapping and Redirect plugin.
    3. Test combination of RateLimiter and Rewrite plugin.
    4. Test combination of RateLimiter and Redirect plugin.
    5. Test combination of Request and Redirect plugin.
    6. Test combination of Request and Rewrite plugin.
    7. Test combination of JWT and RateLimiter plugin.
    8. Test combination of JWT and Redirect plugin.
    9. Test combination of JWT and Rewrite plugin.
    10. Add integrated test of Resilience4j plugin.
    11. Add integrated test of Hystrix plugin.
    12. Update junit4 to junit5.
    13. Add shenyu-examples-springmvc-tomcat.
    14. Optimize the password encryption.
    15. Optimize and verify shenyu-admin module interface parameters.
    16. Optimize the configurable Shenyu agent log collection.
    17. Optimize code about data init when sync data.
    18. Add unit test for LoggingRocketMQPlugin

    Refactor

    1. Used Wheel-Timer instead of ScheduledExecutorService class.
    2. Remove DisruptorProvider#onData(final Consumer function)
    3. Synchronized instance rather than class in MetadataExecutorSubscriber.
    4. Refactor admin buildHandle about register uri.
    5. Spring cloud client auto set port.
    6. Refactor jwt support multi-level tokens.
    7. Remove monitor plugin.
    8. Change logback theme.
    9. remove shenyu-agent.

    Bug Fix

    1. Fix init CommonUpstreamUtils NPE.
    2. Make a judgment on the failure of Nacos registration.
    3. Fix NPE when login with non-existent user.
    4. Fix double log.
    5. Fix misspelled token.
    6. Fix retryCount not work bug.
    7. Fix token parse error.
    8. Fix the trouble of big data in Websocket.
    9. Fix NettyHttpClientPlugin did not retry when failed.
    10. Fix CVE-2021-41303.
    11. Fix judgment of the contains condition of all plugins does not work.
    12. Fix http headers lose bug.
    13. Fix Bug The Rewrite Plugin should support {PathVariable} request.
    14. Fix Bug about data sync with Nacos.
    15. Fix Nacos namespace config.
    16. Fix NPE or websocket proxy fails when the context-path plug-in is opened.
    17. Fix http registers the client plug-in port occupancy detection.
    Source code(tar.gz)
    Source code(zip)
  • v2.4.2(Jan 25, 2022)

    New Features

    1. Add Mqtt plugin
    2. Add Shenyu-Agent module support observability
    3. Add opentelemetry plugin on Shenyu-Agent module
    4. Add jaeger plugin on Shenyu-Agent module
    5. Add zipkin plugin on Shenyu-Agent module
    6. Support Shenyu instance register by zookeeper
    7. Support Shenyu response data custom format
    8. Support https for upstream check
    9. Add RpcContextPlugin to transmit header to rpc context
    10. Support cluster model for dubbo plugin
    11. Support Shenyu instance register by ETCD

    API Changes

    1.Add configuration properties for HTTP synchronization data 2.Remove'/shenyu-client/','/configs/','/plugin'interface from the whitelist interface of Shenyu admin

    Enhancement

    1. Optimize global error handler for flexible processing
    2. Optimized the database access in the loop
    3. Optimize result media type and reset response header
    4. Enhancement crossfilter filter the same headers
    5. Optimize shenyu context module data
    6. Optimize dubbo plugin
    7. Optimize admin db operation
    8. Refactor Response and Cryptor plugin
    9. Optimize Admin Resource Permission loader
    10. Add authentication on shenyu admin when register by http
    11. Optimize netty config.
    12. Optimize SQL files for resource,permission
    13. Add ExcludeOperatorJudge for selector and rule
    14. Add docker-compose on Shenyu-dist
    15. Enhance the ability of jwt plugin

    Refactor

    1. Remove SpEL and Groovy plugins
    2. Optimization prompt of ExtensionLoader
    3. Add http client strategy property
    4. Refactor shenyu client

    Bug Fix

    1. Fix sentinel Plugin-exception number is not effective
    2. Fix HttpClientProperties.javaresponseTimeout can not config in yaml
    3. Fix Connection reset by peer Exception on webclient
    4. Fix register metadata and uri order
    5. Fix Admin when press the Add button
    6. Fix Spi config
    7. Support Dubbo Plugin Single Parameter Primitive Type
    8. Fix using etcd cluster to sync data init failed
    9. Fix Shiro get white list is null bug
    10. Fix zookeeper sync error handling event bug
    11. Fix modify-response-plugin and cryptor-response-plugin are used in combination, and no information is returned
    12. Fix the bug of missing some field in cryptor rule handler using h2
    Source code(tar.gz)
    Source code(zip)
  • v2.4.1(Oct 24, 2021)

    New Features

    1. Support PostgreSQL for admin
    2. Support dynamic loading plugin
    3. Support local modification data mode
    4. Add Websocket plugin
    5. Add CryptorRequest plugin
    6. Add CryptorResponsePlugin plugin
    7. Support Grayscale Release for SpringCloud
    8. Support Grayscale Release for Apache Dubbo
    9. Implement the async dubbo invoking for alibaba-dubbo
    10. Support external cross filter config
    11. Support sign plugin custom dynamic sign provider

    API Changes

    1. Refactor shenyu config in yaml

    Enhancement

    1. Optimze code about dubbo async call
    2. Add loadbalancer common module
    3. Optimize sql init
    4. Refactor Admin PageHelper to query list
    5. Optimize GlobalErrorHandler
    6. Optimize the return value of the'skip' method interface of'ShenyuPlugin' to boolean
    7. Optimize register rules
    8. Modify dubbo and sofa param resolve service
    9. Refactor sign plugin api
    10. Remove websocket filter

    Refactor

    1. Remove lombok dependency
    2. Remove mapstruct dependency
    3. Support JDK8 ~ JDK15
    4. Add missing plugin_handle sql for plugin motan

    Bug Fix

    1. Fix JsonSyntaxException in jwt plugin
    2. Fix sql miss for resilience4j plugin handler
    3. Fix disruptor problem of hold event data in consume event
    4. Fix deadlock bug of HealthCheckTask
    5. Fix client retry the connection add log and increase sleep time
    6. Fix the default_group of nacos
    7. Fix maven ignore and docker entrypoint
    8. Fix admin Return password question
    9. Fix LDAP query built from user-controlled source
    10. Fix the IP address retrieval error
    11. Fix Gson toJson is null
    12. Fix the index out of range bug for context path.
    13. Fix monitor init metrics label bug
    14. Fix GlobalErrorHandler error object to map bug by JacksonUtils.toMap
    15. Fix modify response plugin order bug
    16. Fix the bug of register
    17. Fix sofa plugin register metadata and parameters resolve
    18. Fix motan ,dubbo, sofa plugin metadata init bug
    Source code(tar.gz)
    Source code(zip)
  • v2.4.0(Aug 8, 2021)

    New Features

    • Support reading init_script file which is not under resource/directory
    • Display the plugin menus in categories
    • Admin add execute Multi-path sql script
    • IpUtils add a parameter to select the network ip
    • Add parameter-mapping plugin
    • Support Consul as shenyu-register-center
    • Support Etcd as shenyu-sync-data-center
    • Add sentinel customized fallbackhandler
    • Add response plugin
    • Add JWT plugin
    • Add Request plugin
    • Add Motan plugin
    • Add Logging plugin
    • Add Modify-response plugin
    • Add Oauth2 plugin
    • Add Menu Resource Permissions
    • Add Data Permissions

    API Changes

    • Change the project name from Soul to ShenYu
    • Change the group id from org.dromara to org.apache.shenyu

    Enhancement

    • H2 support insert ingore into in Mysql model
    • Improvements For the Apache Dubbo plugin
    • Optimization of GRPC plugin

    Refactor

    • Refactor code about "async invoke" is not supported in Dubbo lower than 2.7.3
    • Replace the term Operator by Predicate
    • Refine judge conditions operator
    • Refactor PredicateJudge module using SPI
    • Refactor code about client register

    Bug Fix

    • Fix the JwtUtil.getUserId method bug
    • Fix the shenyu-spring-boot-starter bug
    • The encoded urlPath will be re-encoded in WebClientPlugin
    • Replace The Risky Cryptographic Algorithm "AES/ECB/NoPadding"
    • ReadTimeoutHandler on a channel which in a PooledConnectionProvider would cause an unexpected ReadTimeoutException
    • Got ClassNotFoundException while start my Gateway in 2.4.8 spring boot
    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(Apr 2, 2021)

    soul-admin

    • Add 'open' field to allow app path authentication or not in sign plugin. #1168
    • Optimize divide plugin to use common plugin template in soul-dashboard. #1163
    • Add default values and rule checks in plugin handler. #1112
    • Add resource management to allow user to add plugin, adjust menu and button resource and so on in soul-dashboard and soul-admin. #1034
    • Add menu and data permission in soul-admin. #917
    • Add H2 stroe for soul-admin #918

    soul-bootstrap

    • Add tars plugin #863
    • Add sentinel plugin #331
    • Add sofa plugin #384
    • Add Resilience4j plugin for soul-plugin. #434
    • Add Context path mapping plugin for soul-plugin. #894
    • Add Grpc plugin supports grpc protocol. #1081
    • support form submission for dubbo plugin.#339
    • feat(plugin handle): #307
    • Add dist package module #320
    • Add test cases for soul-admin #500
    • Add register center for consul #1148
    • Add register center for etcd #1161
    • Add register center for nacos #1182
    • Add register center for zookeeper #1141 #1139
    Source code(tar.gz)
    Source code(zip)
    soul-admin-bin-2.3.0-RELEASE.tar.gz(65.20 MB)
    soul-bootstrap-bin-2.3.0-RELEASE.tar.gz(96.17 MB)
Owner
The Apache Software Foundation
The Apache Software Foundation
A high availability shopping(ecommerce) system using SpringBoot, Spring Cloud, Eureka Server, Spring Cloud Gateway, resillience4j, Kafka, Redis and MySQL.

High-availability-shopping-system A high availability shopping(ecommerce) system using SpringBoot, Spring Cloud, Eureka Server, Spring Cloud Gateway,

LeiH 1 Oct 26, 2022
Spring boot microservice example with Eureka Server + Eureka Client + Spring Cloud API Gateway + OAuth2.0 + Circuit Breaker + Resilience4J + FeignClient + RestTemplate

Spring boot microservice example Spring boot microservice example with Eureka Server + Eureka Client + Spring Cloud API Gateway + OAuth2.0 + Circuit B

Subhash Lamba 47 Dec 29, 2022
Spring MSA api gateway & service discovery with consul & Jaeger & Cassandra

Spring-Cloud-MSA 준비 Cassandra 서버를 준비한다 table.sql 파일로 keyspace와 테이블을 만들어 둔다 Consul 1.11.1버전 기준 https://www.consul.io/downloads 에서 1.11.1 버전 운영체제 맞게 다운

INSUNG CHOI 2 Nov 22, 2022
Sample Spring-Cloud-Api-Gateway Project of Spring Boot

Sample-Spring-Cloud-Api-Gateway Sample Spring-Cloud-Api-Gateway Project of Spring Boot Proejct Stack Spring Webflux Spring Cloud Gateway Spring Data R

Seokhyun 2 Jan 17, 2022
A dubbo gateway based Java language.

A dubbo gateway based Java language.

老夫正年轻 19 Sep 24, 2022
Demo microservice architecture with Spring ,Spring Cloud Gateway , Spring Cloud config server , Eureuka , keycloak and Docker.

spring-microservice Demo microservice architecture with Spring ,Spring Cloud Gateway , Spring Cloud config server , Eureuka , keycloak and Docker. Arc

null 4 Sep 13, 2022
ActiveJ is an alternative Java platform built from the ground up. ActiveJ redefines web, high load, and cloud programming in Java, featuring ultimate performance and scalability!

Introduction ActiveJ is a full-featured modern Java platform, created from the ground up as an alternative to Spring/Micronauts/Netty/Jetty. It is des

ActiveJ LLC 579 Jan 7, 2023
✈A high-performance RPC based on Java & Netty.

bRPC README 中文版本 一个基于netty的RPC框架 基于netty NIO、IO多路复用。 client与server端建立心跳包保活机制。发生未知断连时,重连保证可靠长连接。 使用kryo序列化,自定义传输包,及传输格式,避免TCP沾包问题。 支持zookeeper或nacos做服务

vincent 238 Dec 16, 2022
High Performance data structures and utility methods for Java

Agrona Agrona provides a library of data structures and utility methods that are a common need when building high-performance applications in Java. Ma

Real Logic 2.5k Jan 7, 2023
A modular, high performance, headless e-commerce(ecommerce) platform built with Java,Springboot, Vue.

What is Shopfly? Shopfly is modular, high performance, headless e-commerce(ecommerce) platform built with Java,Springboot, Vue. Architecture Shopfly i

Shopfly 31 Jul 17, 2022
A modular, high performance, headless e-commerce(ecommerce) platform built with Java,Springboot, Vue.

What is Shopfly? Shopfly is modular, high performance, headless e-commerce(ecommerce) platform built with Java,Springboot, Vue. Architecture Shopfly i

Shopfly 29 Apr 25, 2022
The High-Performance Java Persistence book and video course code examples

High-Performance Java Persistence The High-Performance Java Persistence book and video course code examples. I wrote this article about this repositor

Vlad Mihalcea 1.1k Jan 9, 2023
Spring-Boot-Plus is a easy-to-use, high-speed, high-efficient,feature-rich, open source spring boot scaffolding

Everyone can develop projects independently, quickly and efficiently! What is spring-boot-plus? A easy-to-use, high-speed, high-efficient, feature-ric

geekidea 2.3k Dec 31, 2022
High performance RPC framework based on netty

RPC(Remote Procedure Call)实战 @desc: 仅用于个人学习、了解RPC @date: 2021/01/16 技术组成: 版本一 版本二 版本三 传输层 Netty4 * * 编码层 Kryo * * 应用层 JDK动态代理 * * 服务注册与发现 手动注册+guava缓存

XDD 10 Nov 22, 2022
Universal, flexible, high-performance distributed ID generator

CosId Universal, flexible, high-performance distributed ID generator 中文文档 Introduction CosId aims to provide a universal, flexible and high-performanc

Ahoo Wang 256 Dec 27, 2022
Asynchronous, high-performance Minecraft Hologram library for 1.8-1.18 servers.

Hologram-Lib Asynchronous, high-performance Minecraft Hologram library for 1.8-1.18 servers. Requirements This library can only be used on spigot serv

null 45 Dec 20, 2022
High level api to interact with maven form within the jvm

maven-utils High level api to interact with maven from within the jvm Use it by adding the dependency to your maven pom: <dependency> <groupId>se.

Alipsa 5 Sep 29, 2022
There are two challenges one is to create a backend api the other is to create a frontend application to consume the public data api devall.

Sobre | Desafio | Resolução | Tecnologias | Execução | Itexto desafio tecnico Sobre os Desafios existem dois desafios um é criar uma api backend o out

fabricio S Miranda 1 Oct 18, 2021
Deploy this 🔥🔥🔥 BLAZING FAST 🔥🔥🔥 API to get instant access to ✨✨✨ INNOVATIVE ✨✨✨ API to quickly define whether the numbers are odd or even.

Is Odd API This ?? is ?? ?? a ?? simple API that ?? returns ?? whether ?? ?? a ?? number ?? ?? is ?? ?? odd ?? or ?? not. ♂ With ?? ?? this ?? ?? API

rferee 5 Sep 23, 2022