• [技术干货] CSE重试和隔离如何判断错误?
    注意:重试和隔离在不同的应用场景下存在不同的理解。 CSE 在负载均衡管理(loadbalance handler)和熔断容错管理(bizkeeper)模块存在针对不同场景的功能设计, 请注意区分。 负载均衡模块:https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance/简单的描述:1. 网络错误 + 503错误码等情况可以触发重试。2. 网络错误 + 503错误码 + 超时等错误可以触发隔离。细节内容可以参考代码:Retry: https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/DefaultRetryExtensionsFactory.javaIsolation: https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java   参考isFailedResponse 关于隔离恢复:https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java   参考allowVisit 内部线程只会触发快速隔离,不会触发恢复,参考: https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java  里面的Timer线程熔断容错管理模块:https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/bizkeeper/在实际的应用系统中,实例隔离和失败重试是保证服务可靠运行做重要的治理能力,这些能力在loadbalance模块提供。 此外, CSE还提供了bizkeeper模块,这个模块集成了Hystrix的隔离仓等能力,这个隔离能力是针对微服务或者接口级别的,在实际业务系统中,发挥作用比较少。 这个模块也有判读错误条件:consumer: 490异常。 比如网络操作、超时等。 参考:https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ConsumerBizkeeperCommand.javaprovider: 590异常。比如业务处理抛出的未知RuntimeException等。 参考:https://github.com/apache/servicecomb-java-chassis/blob/master/handlers/handler-bizkeeper/src/main/java/org/apache/servicecomb/bizkeeper/ProviderBizkeeperCommand.java
  • [技术干货] 如何使用CSE实现文件下载
    文档参考:  https://docs.servicecomb.io/java-chassis/zh_CN/general-development/file-download.html 代码示例: https://github.com/apache/servicecomb-java-chassis/blob/master/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/DownloadSchema.java
  • [教程] 【必备技能】微服务引擎专享版 vs 微服务引擎基础版
    微服务引擎基础版:本质上逻辑多租,所有租户用户共用一套微服务引擎(注册中心、配置中心、治理中心),按照官方公布的计费方式,后续主要提供按需计费。微服务引擎专享版:本质上物理多租,每个租户独享微服务引擎,管理规模更大、访问性能更佳、物理级隔离,安全性更高!言归正传,到底微服务引擎基础版、专享版怎么使用呢?微服务引擎基础版正确的打开方式:最便捷的打开方式——>云上工程:基于模板自动化创建项目、自动构建、自动部署和自动注册到微服务引擎基础版统一注册中心(例如,华北区是https://cse.cn-north-1.myhuaweicloud.com)Step1:创建云上工程查看结果:流水线自动运行成功查看结果:自动创建容器应用查看结果:自动注册到微服务引擎基础版服务中心微服务引擎专享正确的打开方式:最便捷的打开方式——>仅需修改修改容器应用环境变量环境变量key环境变量value微服务引擎基础版PAAS_CSE_ENDPOINT引擎列表中获取,华北区为https://cse.cn-north-1.myhuaweicloud.com微服务引擎专享版PAAS_CSE_ENDPOINT引擎列表中获取,形如https://192.168.xxx.xxx:30100查看结果:自动注册到微服务引擎专享版版(专享版名称none1121)的服务中心
  • [教程] 【代码生成】微服务引擎提供的基于Swagger-Codegen的代码生成插件
    最新版本:  2.2.8插件简介:   服务契约,指基于OpenAPI规范的微服务接口契约,是服务端与消费端对于接口的定义。服务契约用于服务端和消费端的解耦,服务端围绕契约进行服务的实现,消费端根据契约进行服务的调用。ServiceComb使用yaml文件格式定义服务契约,可支持多种风格开发微服务。   CSE-Codegen是基于Swagger Codegen实现的代码生成工具,用户只需在微服务工程的服务端和消费端的pom文件分别引入插件依赖,就可以根据定义好的契约文件生成服务端和消费端的框架代码,轻松构建微服务应用。插件特性:    l   新增契约同步功能    支持从远端的Git仓库同步一个或多个契约到微服务工程中,每次运行都可以根据最新的契约生成框架代码。    l   推荐使用SpringMVC风格开发微服务    在不指明language的情况下默认生成SpringMVC风格的框架代码。    l   支持微服务工程服务端和消费端代码生成    通过在微服务工程的pom文件中配置插件依赖,生成以下文件:服务端provider生成model + delegate + controller + impl,消费端consumer生成model + delegate + impl。    l   适应多服务多契约的场景    在配置中增加参数,可以适应多服务多契约的场景。    l   避免model路径不统一导致consumer调用provider失败    要求契约的definitions的model具备x-java-class,根据包路径优先级(x-java-class > service.packageName > packageName)生成model包路径,避免model路径不统一导致consumer调用provider失败。    l   最大程度保证显式契约和隐式契约一致    严格按照契约定义,针对契约的不同返回码,生成的框架代码会在,最大程度保证显式契约和隐式契约一致。    Step1:setting.xml增加repository和pluginRepository  <mirrors> <mirror> <id>huaweicloud</id> <mirrorOf>*,!HuaweiCloudSDK</mirrorOf> <url>https://repo.huaweicloud.com/repository/maven/</url> </mirror>     </mirrors>   <profiles> <profile> <id>MyProfile</id> <pluginRepositories> <pluginRepository>   <id>HuaweiCloudSDK</id>   <url>https://repo.huaweicloud.com/repository/maven/huaweicloudsdk/</url>   <releases> <enabled>true</enabled>   </releases>   <snapshots> <enabled>true</enabled>   </snapshots> </pluginRepository> </pluginRepositories> <repositories> <repository> <id>HuaweiCloudSDK</id> <url>https://repo.huaweicloud.com/repository/maven/huaweicloudsdk/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </profile>   </profiles>      <activeProfiles>     <activeProfile>MyProfile</activeProfile>   </activeProfiles>Step2: 使用CSE-Codegen插件开发微服务 使用CSE-Codegen插件开发微服务步骤很简单,只需要准备一个Git仓库用于存放契约,在微服务工程里面引入插件依赖,运行插件就能同步远端契约到本地并根据契约生成框架代码。可以参考项目示例代码,步骤如下。                                步骤 1     Git仓库归档契约创建远端Git仓库,用于契约管控,上传契约文件到Git仓库中。可以参考契约仓库示例。                                步骤 2     pom插件配置1.         consumer模块引入huawei-swagger-codegen-maven-plugin,插件版本号是2.2.8。schemaType指明是consumer,参数说明如表2-1所示。<build>    <plugins>        <plugin>            <groupId>io.swagger</groupId>            <artifactId>huawei-swagger-codegen-maven-plugin</artifactId>            <version>2.2.8</version>            <executions>                <execution>                    <goals>                        <goal>generate</goal>                    </goals>                </execution>            </executions>            <configuration>                <skip>false</skip>                <!--<skipOverwrite>false</skipOverwrite>-->                <repositories>                    <repository>                        <!--<userName></userName>-->                        <!--<password></password>-->                        <repoUrl> https://github.com/huaweicse/cse-codegen-schemas.git</repoUrl>                        <branch>master</branch>                        <services>                            <service>                                <!--<appId>lala</appId>-->                                <serviceName>provider</serviceName>                                <packageName>com.huawei.paas.consumer</packageName>                                <schemaType>consumer</schemaType>                                <schemas>                                    <schema>                                        <schemaPath>dir/myservice.yaml</schemaPath>                                    </schema>                                </schemas>                            </service>                        </services>                    </repository>                </repositories>                <packageName>com.huawei.paas.consumer</packageName>            </configuration>        </plugin>    </plugins></build>表1-1 参数说明参数说明skip是否跳过执行该插件功能,默认是true,所以这里需要手动将skip设为false。skipOverWrite是否跳过文件覆盖,默认是false,即每次运行插件都可以更新框架代码。repositories定义多个契约仓库。repository定义单个契约仓库,即远端契约所在的git仓库。userName契约仓库的用户名(选填)。password契约仓库密码(选填)。repoUrl契约仓库地址,http、https、ssh格式都适用。branch契约仓库分支名。services定义多个服务。service定义单个服务,每个服务可以有多个契约文件。appId应用Id(选填,只在consumer这边指定,consumer跨应用调用provider的时候可以填对应的provider的appId)。serviceName服务名packageName(service层)生成的框架代码(delegate、impl、controller)的包路径,当契约中的model里面没有x-java-class,也作为model的包路径。schemaType指定服务是consumer还是provider,根据契约生成相应的框架代码。schemas定义多个契约文件。schema定义单个契约文件。schemaPath契约文件在契约仓库的相对路径。packageName生成代码的包路径,优先级小于service里面的packageName,当两者都没有设置,插件运行回报错。 2.         provider模块引入huawei-swagger-codegen-maven-plugin,插件版本号是2.2.8。schemaType指明是provider。<build>    <plugins>        <plugin>            <groupId>io.swagger</groupId>            <artifactId>huawei-swagger-codegen-maven-plugin</artifactId>            <version>2.2.8</version>            <executions>                <execution>                    <goals>                        <goal>generate</goal>                    </goals>                </execution>            </executions>            <configuration>                <skip>false</skip>                <skipOverwrite>false</skipOverwrite>                <repositories>                    <repository>                        <!--<userName></userName>-->                        <!--<password></password>-->                        <repoUrl> https://github.com/huaweicse/cse-codegen-schemas.git</repoUrl>                        <branch>master</branch>                        <services>                            <service>                                <serviceName>provider</serviceName>                                <packageName>com.huawei.paas.provider</packageName>                                <schemaType>provider</schemaType>                                <schemas>                                    <schema>                                        <schemaPath>dir/myservice.yaml</schemaPath>                                    </schema>                                </schemas>                            </service>                        </services>                    </repository>                </repositories>                <packageName>com.huawei.paas.provider</packageName>            </configuration>        </plugin>    </plugins></build>                                步骤 3     运行插件,同步契约并生成框架代码分别双击consumer和provider的插件huawei-swagger-codegen:generate或者直接编译,插件运行。同步契约:1.         首先会检查工程的gitRepo目录下是否存在同名的Git仓库,如果存在则进行删除。2.         下载整个Git仓库到工程的gitRepo目录下。3.         插件根据scchemaPath查找gitRepo里的契约文件,复制到契约文件到工程的microservices目录下,如目录中存在同名契约则替换掉。生成框架代码:1.         生成consumer端框架代码:model类、delegate接口、impl实现类(具备RPC调用接口)。2.         生成provider端框架代码:model类、controller类、delegate接口、impl实现类。                                步骤 4     根据框架代码,用户实现自己的业务逻辑如果impl目录不存在或者impl目录下不存在契约对应的impl实现类,则生成impl实现类,否则不生成(避免覆盖用户已有的业务逻辑)。用户可以在impl实现类中增加自己的业务逻辑。                                步骤 5     测试consumer和provider测试consumer和provider是否可以通信,可以下载本地服务中心。配置好工程里的microservice.yaml,启动服务中心,使用postman测试consumer和provider是否正常通信。
  • [技术干货] cse.request.timeout 怎么配置operation/schema级别的超时
    CSE支持给每个接口调用单独设置超时时间。 格式为:  cse.request.[microserviceName.[schemaid.[operationid.]]].timeout比如: cse.request.timeout 所有接口cse.request.testSerivce.timeout testService的所有接口
  • [技术干货] 如何使用拦截器
    原来的Spring MVC代码使用如下方式使用拦截器@Configuration public class DemoConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerInterceptor() { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("11111"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }); } }切换CSE以后不生效。这种方式是Spring MVC的方式,CSE提供了类似的方式,CSE有Handler、HttpServerFilter等机制可以替换使用。https://bbs.huaweicloud.com/blogs/02de5f11cb6e11e8bd5a7ca23e93a891介绍了Spring MVC的运行时和CSE的运行时差异. Handler, HttpServerFilter机制开发指南参考: https://docs.servicecomb.io/java-chassis/zh_CN/general-development/http-filter.html 和 https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/intruduction.html
  • [技术干货] 连接服务中心、配置中心时报错,Empty label is not a legal name
    连接服务中心、配置中心时报错,Empty label is not a legal name该问题出现在通过APIGateway连接CSE的场景下,碰到这个问题时需要检查一下自己配置的APIGateway域名是否正确。例如,如果你想要连接华北1区的CSE,那么服务中心、配置中心、monitor的地址应该配置成 https://cse.cn-north-1.myhuaweicloud.com:443当地址配置中缺少"cn-north-1",也就是写成了 https://cse..myhuaweicloud.com:443 时,就会报错,特征日志是 "Empty label is not a legal name"。错误日志如下:[ERROR] sign request failed, uri is https://cse..myhuaweicloud.com:443/v4/default/registry/microservices, message: null com.huawei.paas.foundation.auth.AuthHeaderProviderImpl.getSignAuthHeaders(AuthHeaderProviderImpl.java:70) [ERROR] POST /v4/default/registry/microservices fail, endpoint is cse..myhuaweicloud.com:443, message: Empty label is not a legal name org.apache.servicecomb.serviceregistry.client.http.RestUtils.lambda$null$1(RestUtils.java:93) [ERROR] Config update from https://cse..myhuaweicloud.com:443 failed. Error message is [Empty label is not a legal name]. org.apache.servicecomb.config.client.ConfigCenterClient$ConfigRefresh.lambda$null$13(ConfigCenterClient.java:426) [ERROR] sign request failed, uri is https://cse..myhuaweicloud.com:443/v3/default/configuration/items?dimensionsInfo=loadbalance-isolation-server%40demo-loadbalance-isolation%230.0.1&revision=default, message: null com.huawei.paas.foundation.auth.AuthHeaderProviderImpl.getSignAuthHeaders(AuthHeaderProviderImpl.java:70)
  • [技术干货] 如何在微服务之间配置和使用会话粘滞策略
    场景描述:一个客户登录后,始终把请求发送到某一个实例。当第一次访问这个实例的时候,需要记录会话ID对应的实例是A,这个会话下次发起同样的请求的时候,仍然访问A。CSE提供的会话粘滞:CSE并没有提供上述场景的会话粘滞策略实现。因为一个系统的会话管理是多样的,CSE框架并不知道如何标记一个请求属于哪个会话。CSE提供了一个简化的会话粘滞实现,保证对于一个接口的访问,尽可能发送到上一次访问的实例,负载均衡策略名字为SessionStickiness,修改负载均衡策略参考https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.html。如果用户需要实现“场景描述”里面的会话粘滞策略,需要考虑自定义负载均衡策略,实现相关接口即可。详细可以参考SessionStickiness、RoundRobin等CSE自带的负载均衡的策略实现。
  • [技术干货] 【吐槽】用过最恶心的微服务框架CSE
    忍不住想吐槽一下,不吐不快,昨天处理了一天SpringBoot异步问题问题描述:CSE+Springboot,请求我用DeferredResult异步封装,结果引入CSE后,异步响应还没回复就给我序列化了一个"setOrExpired": false针对这个问题,先是一顿猛搜,结果大失所望,网上用CSE的都门可罗雀,基本没任何可用信息,实在没辙,耐着性子看源码问题出在下面:CSE用反射的方式拿到controller对象,直接返回controller对象的结果,于是就出现了如果你想异步,对不起不可以,我会先反序列化你的结果,就算为null,我也给你返回去同时还有一个问题产生了,因为他要序列化,序列化的时候又没法指定类型,所以序列化方法上定义接口、Object同样也是不行的恶心的同时出现了第三个问题,它自己把这个方法try cache了,所以你想用@ExceptionHandler(Exception.class)这个全局异常捕获,对不起不可以,我在前面给你catch了,压根不会到你哪一步总结:这就是我CSE的一天,各种问题,恶心之极,老实说要不是我的北向网元用的恶心的CSE(当然它们不考虑并发、异步、代码各种if else),我打死都不会用CSE奉劝各位,赶紧远离这个垃圾微服务框架,各种恶心之极,我想这也许就是它不流行,小众的原因。了解一次的人,压根不想在它上面浪费时间
  • [技术干货] CSEJavaSDK连sc报错 404:Not Found, &quot;error_msg&quot;:&quot;API not exist or not published in the environment&quot;
    某些时候微服务注册到华为云CSE的时候,日志里面会打印错误内容2018-11-05 17:17:04.208  WARN 12692 --- [ntloop-thread-0] o.a.s.s.c.h.ServiceRegistryClientImpl    : get response for org.apache.servicecomb.serviceregistry.api.response.GetSchemasResponse failed, 404:Not Found, {"error_msg":"API not exist or not published in the environment","error_code":"APIGW.0101","request_id":"284c5c8b68ceed2411cbe958df208149"}这是由于microservice.yaml文件里面配置的连接服务中心、配置中心等的APIGateway地址还是旧域名https://cse.cn-north-1.myhwclouds.com,改成新的地址https://cse.cn-north-1.myhuaweicloud.com:443 就可以解决问题了。 PS:旧域名的APIGateway已经不更新了,并且预计以后会停止工作。推荐大家根据CSE或ServiceStage的CSE-SDK工具下载页面上发布的地址更新自己的配置
  • [技术干货] 已解决!!!+求助:微服务引擎出现错误Search domain query failed
    错误日志:ERROR 13160 --- [ntloop-thread-0] o.a.s.config.client.ConfigCenterClient   : Config update from https://cse.cn-north-1.myhuaweicloud.com failed. Error message is [Search domain query failed. Original hostname: 'cse.cn-north-1.myhuaweicloud.com' failed to resolve 'cse.cn-north-1.myhuaweicloud.com' after 2 queries ].
  • [技术干货] 求助 SpringBoot Gradle 集成CSE
    都什么年代了,JAVA项目整体趋势是Gradle,到现在为止官网还没有给开发者提供一个SpringBoot Gradle集成CSE的指导,最近立项新项目,技术选型用的gradle作为编译,集成CSE真心蛋疼,各种报错,耗时耗功,跪求一个个SpringBoot Gradle集成CSE的指导
  • 业务代码抛出异常, CSE微服务引擎将HTTP错误码包装为590非500, 能否关闭这一特性?
  • [技术干货] CSE如何设置HTTP的请求URL、Header、Body大小限制
    分场景。如果是tomcat场景,可以参考tomcat配置。如果是vert.x的HTTP服务器,下面几个参数可以参考:servicecomb.uploads.maxSize : 设置body的限制大小。servicecomb.rest.server.maxHeaderSize: 设置请求header大小限制。servicecomb.rest.server.maxInitialLineLength: 设置HTTP请求的第一行长度限制。(即URL)
  • [技术干货] 使用CSE SDK在TCP、SSL握手过程中netty打印的日志如何关闭
    对于一些异常协议报文测试, CSE SDK 会打印大量的netty异常日志,比如:----TCP握手失败2018-09-03 14:13:31,843 [WARN ] [transport-vert.x-eventloop-thread-27][io.netty.util.internal.logging.Slf4JLogger.warn(Slf4JLogger.java:151)] An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.java.io.IOException: Connection reset by peerat sun.nio.ch.FileDispatcherImpl.read0(Native Method)at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)at sun.nio.ch.IOUtil.read(IOUtil.java:192)at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1108)at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:345)at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.lang.Thread.run(Thread.java:748)----SSL握手失败[2018-09-20 20:13:33,209/CST][transport-vert.x-eventloop-thread-4][WARN]An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. io.netty.util.internal.logging.Slf4JLogger.warn(Slf4JLogger.java:151)io.netty.handler.codec.DecoderException: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f20485454502f312e310d0a486f73743a203139322e3136382e302e3230343a383038320d0a436f6e6e656374696f6e3a206b6565702d616c6976650d0a43616368652d436f6e74726f6c3a206d61782d6167653d300d0a557067726164652d496e7365637572652d52657175657374733a20310d0a557365722d4167656e743a204d6f7a696c6c612f352e30202857696e646f7773204e542031302e303b20574f57363429204170706c65576at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459)at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)at io.netty.channel.AbstractChannelHandlerC可以通过:log4j.logger.io.netty.channel.DefaultChannelPipeline=ERROR,paas,stdout来关闭。 注意修改下后面的pass, stdout为自己的logger。关闭后,对于底层协议(TCP、SSL)可能没有任何错误信息。 会给定位带来麻烦。需要注意下。 新版本会做适当的优化,即即使给这个日志关闭,也打印少量的信息。
总条数:274 到第
上滑加载中