• [技术干货] 租户链接CSE的服务中心进行服务注册发现需要授予哪些权限
    租户的微服务通过AK/SK访问CSE服务。有些用户需要创建子账号访问CSE,这些用户需要分配下面的权限之一:SvcStg OperatorSvcStg AdminSvcStg Developer对于服务注册发现场景,分配SvcStg Developer权限即可。 
  • [技术干货] CSE如何配置多个服务中心、配置中心、监控中心地址及其常见错误
    CSE支持配置多个服务中心、配置中心、监控中心地址,在一个实例故障的时候,自动切换到另外一个实例,增强了可靠性。目前有如下几种配置方法。第一种,在microservice.yaml中指定:cse:   service:     registry:       address: http://127.0.0.1:30100,http://127.0.0.2:30100第二种,通过JAVA参数指定java -Dcse.service.registry.address=http://127.0.0.1:30100,http://127.0.0.2:30100 -jar Application.jar这种方式也可以配套环境变量使用export SC_ADDRESS=http://127.0.0.1:30100,http://127.0.0.2:30100 java -Dcse.service.registry.address=${SC_ADDRESS} -jar Application.jar第三种,使用变量别名(Mapping)如果用户依赖了cse-solution-service-engine这个组件,那么系统提供了默认的别名映射。PAAS_CSE_ENDPOINT:   - cse.service.registry.address   - cse.config.client.serverUri PAAS_CSE_SC_ENDPOINT:   - cse.service.registry.address PAAS_CSE_CC_ENDPOINT:   - cse.config.client.serverUri因此用户只需要设置环境变量即可export PAAS_CSE_ENDPOINT=http://127.0.0.1:30100,http://127.0.0.2:30100错误用法由于archaius接口设计上的问题,下面这种用法是错误的。 会导致只有第一个地址被使用,第二个地址被忽略。在microservice.yaml中指定:cse:   service:     registry:       address: ${SC_ADDRESS}设置环境变量export SC_ADDRESS=http://127.0.0.1:30100,http://127.0.0.2:30100这种方式读取到的实际地址只有一个http://127.0.0.1:30100。因为archaius会将cse.service.registry.address解析为String类型,而SC_ADDRESS解析为List类型,在类型转换的时候,会取第一个元素。 一般的,涉及到配置的参数被当做数组进行解析,使用Place Holder的方式配置,都会出现类似问题。参考材料: CSE配置层次和动态配置机制https://docs.servicecomb.io/java-chassis/zh_CN/general-development/config.html
  • [技术干货] 使用Tomcat作为服务器,并采用CSE客户端调用,低概率出现请求失败
    问题现象和场景:  服务端使用Tomcat作为服务器, 客户端使用CSE调用。在大规模并发的场景下,低概率出现请求失败问题原因:Tomcat默认会在一定周期内(IDLE),达到一定请求数后关闭连接(active requests)关闭HTTP连接,导致请求失败。 解决方案:对于使用Tomcat + CSE SDK场景,使用Tomcat做HTTP协议接入的业务,临时规避方案如下(Tomcat的server.xml文件):1、  maxKeepAliveRequests修改为-12、  keepAliveTimeout修改为10分钟修改策略是:对于内部的RPC调用,尽量不要频繁的重建HTTP连接,HTTP空闲连接的回收时间配置长一些,5分钟或者10分钟,或者由CSE 消费端来控制,Tomcat服务端不用控制。最终解决方案:CSE给Vert.X社区提问题单,在下一个CSE版本中修复连接池的BUG,即:如果消息发送时发现连接不可用,要立即失败,并按照业务的重试策略自动重试,对业务的效果就是业务不感知底层HTTP连接的关闭和自动重试,保障业务的成功率。
  • [问题求助] [CSE Mesher] CSE Mesher如何使用分布式跟踪
    最近在选型service mesh框架,对比istio和cse mesher。istio支持分布式跟踪,只需在应用调用http请求时,在http header里面添加相关的项即可。参考https://istio.io/docs/tasks/telemetry/distributed-tracing/CSE Mesher是否有类似的功能?如何配置?比如A -> A mesher -> B mesher -> B -> B mesher -> C mesher -> C想跟踪从A触发到B、C的请求,必须在B中传递相关跟踪的上下文才能保持链路的完整。
  • [技术干货] CSE指定ip发送请求给对应服务
    使用CSE开发的服务,client端发送请求访问server端的接口时,会去服务中心获取server端的endpoint和契约等信息,将查询到的endpoint塞到invocation中,然后发送请求到server端对应的endpoint;如果想要client端不发送给查询服务中心得到的endpoint,而是发送给另外指定的endpoint,以满足某些拨测场景,可以进行如下设置。1、在client端的配置文件里添加配置servicecomb.loadbalance.userDefinedEndpoint.enabled: true2、在localcontext里设置scb-endpoint的值,以rest或highway开头,格式为rest://127.0.0.1:8090,符合CSE的endpoint通用格式;3、发送请求即可;
  • [技术干货] 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工具下载页面上发布的地址更新自己的配置
总条数:279 到第
上滑加载中