-
问题说明:有些URL的参数值包含逗号、分号,比如:http://host?param=1,2,3;4,5,6CSE解析的时候,将其解析为 param = 1,2,3 和 4,5,6= 两个参数。 但是在Tomcat(比如spring boot运行时), 解析为一个参数 param = 1,2,3;4,5,6问题原因:早期HTTP服务器的实现,分号(;)和连接号(&) 被不同的服务器用于param的分隔符。 后来HTTP协议标准化了,推荐用连接号(&), 但是分号(;)仍然被定义为了保留字。有些WEB SERVER的实现把分号(;)和连接号(&)同等对待(比如CSE的vert.x),另外一些WEB服务器没考虑分号(;),比如TOMCAT。解决方案vert.x和tomcat实现不一致,都没违背HTTP协议标准,但是给开发者带来了误解。 由于分号(;)和连接号(&)在HTTP协议里面都是保留字,如果作为参数值,保留字是需要转义的。 因此这类问题应该定义为客户端BUG,在拼接URL前,需要先进行转义。 http://host?param=1,2,3%3B4,5,6 (encodeURIComponent会给逗号也转码,这里供参考)
-
edge service 可以配合oauth2 使用吗,现在看来,oauth2的oauth/token 接口,无法生成契约所以,访问不到,这个请教一下怎么解决?这个问题稍微有些复杂,至少 有两个过程需要解决: 1. edge转发调往oauth2 server的请求。由于oauth2 server可能是采用第三方技术,比如spring cloud开发的,这些服务不会生成契约,所有edge service的默认路由转发(DefaultDispatcher)没法工作。这个需要专门针对oauth2 server做一个转发器。 2. edge拦截调往其他服务的请求,做token检查。 我没有详细了解过使用oauth2的认证过程,这块不好解答,如果是完全无状态的token,这块只需要在edge handler检查下token有效性。感觉不复杂。解决第一个问题: https://github.com/huaweicse/cse-java-chassis-samples/blob/master/HouseAppWithSpringBoot2/edge-service/src/main/java/com/huawei/cse/houseapp/edge/WebPageDispatcher.java 这里有个例子,是一个通用的http转发器,可以将请求转发给任意提供HTTP端口的服务。针对第一个问题,这里还有个例子比上面例子的功能稍微完善一些,实现了负载均衡、实例隔离等功能。https://github.com/huaweicse/cse-java-chassis-samples/blob/7de5db bcfae46865966140eecdb3dad43c85f2b4/porter/gateway-service/src/main/java/com/huawei/cse/porter/gateway/UiDispatcher.java针对第二个问题,如果edge在认证的时候,还需要调用oauth2 server的接口,那么可以采用第三方接口访问的方式调用,或者自己写个http client调用,也是我刚刚发的代码,vert.x httpclient能够很好支持异步,比较适合edge逻辑,如果采用spring或者apache http client,则异步代码不好写。 servicecomb原生接口(RCP)访问第三方服务参考,比较类似feign的用法:https://docs.servicecomb.io/java-chassis/zh_CN/build-consumer/3rd-party-service-invoke.html 当然这个步骤可能是不需要的,取决于oauth2的流程。
-
报错:2019-03-15 14:31:35,091 [ERROR] Config update from http://127.0.0.1:30113 failed. Error message is [Connection refused: no further information: /127.0.0.1:30113]. org.apache.servicecomb.config.client.ConfigCenterClient$ConfigRefresh.lambda$null$13(ConfigCenterClient.java:426)问题分析:配置中心http://127.0.0.1:30113地址不对,但这个地址在哪看呢?本地服务中心的app.conf吗?没有找到,请大神指点@华为技术答疑~姚海石(CSE)
-
Istio利用k8s的探针对service进行流量健康检查,有两种探针可供选择,分别是liveness和readiness:liveness探针用来侦测什么时候需要重启容器。比如说当liveness探针捕获到程序运行时出现的一个死锁,这种情况下重启容器可以让程序更容易可用。readiness探针用来使容器准备好接收流量。当所有容器都ready时被视为pod此时ready。比如说用这种信号来控制一个后端服务,当pod没有到ready状态时,服务会从负载均衡被移除。使用场景:liveness探针被用来移除异常的pod,不重启pod就无法恢复的应用常使用liveness探针。比如前文提到的死锁,进程会一直处于活跃状态,k8s会认为正常并继续发送流量。但使用liveness探针之后会发现应用已经不再处理请求,继而重启异常pod。readiness探针被用来控制流量进入pod。比如应用程序需要加载一个大的文件或者需要启动后进行一些配置。但默认只要容器进程启动完成就会有流量发送过来。使用readiness探针会一直等待直到完成所有加载或配置再让流量进入。两种探针的配置相似,区别在于使用livenessProbe还是readinessProbe字段探针配置参数:探针有以下几个参数:initialDelaySeconds:容器启动之后到启动探针之间的时延periodSeconds:探针的循环执行时间,最小单位为1秒timeoutSeconds:探针超时时间,默认值1秒successThreshold: 成功阈值数,失败之后最小的连续成功信号数,liveness必须是1failureThreshold:失败阈值数,当探针失败之后,在放弃之前k8s尝试重新执行探针次数,如果是liveness探针放弃意味着重启容器,readiness探针意味着pod标记为unready,默认值为3次。HTTP探针还有以下额外的参数:host: 所连接主机名,默认值是pod IPscheme: HTTP或者HTTPSpath: 访问HTTP 服务器的路径httpHeaders: 访问HTTP的报头port:访问容器的端口探针可以进行三种操作:命令行:在容器中执命令行操作,exit 0为成功状态HTTP请求:向容器发送HTTP GET请求,如果返回值为200-400之间为成功状态TCP 请求:向指定端口发送TCP请求,如果该端口开放监听,则为成功下面我们来演示以下健康检查的操作:命令行操作首先准备busybox镜像,设置如下的yaml配置文件:在配置文件中我们设置了一个liveness探针,在容器启动之后的5s,每隔5s去执行一下访问/tmp/healthy这个文件的操作,如果操作成功返回0,则为容器健康,如果返回值不为0, 会重启容器。当容器启动之后会执行:touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600前30s会建立/tmp/healthy文件,30s之后删除,此时访问会返回错误.使用kubectl create -f ./your-exec-liveness.yaml建立pod在30s之内通过kubectl describe pod liveness-exec来查看pod状态,为健康:在30s之后查看pod的状态,发现无法访问文件,返回不健康:之后查看pod的状态,pod的重启次数为1,此时通过liveness探针检测到不健康状态已经重启pod。如果使用readiness探针,需要修改上文your-exec-liveness.yaml的红框字段:通过与上文相同的方法,在30s之前查看pod的状态,为ready:在30s之后查看pod状态,readiness探针将应用容器置为unready, ready的容器是istio-proxy:可以看到readiness探针并不会重启容器。HTTP请求另一种使用liveness探针的方法是HTTP GET请求,可以用来监测网页的运行状态,我们用google liveness镜像来进行演示:这里我们让HTTP的服务器/healthz路径前10s返回200 的OK状态,10s之后返回状态500。设置如下的配置文件:liveness探针会向容器的8080端口发送请求访问/healthz, 在容器启动3s之后每隔3s发送一次。我们建立pod并查看pod的运行状态kubectl describe pod liveness-http:会发现10s之后 liveness探针监测到了返回值是500,状态标记为不健康。TCP请求两种探针还可以共同使用,下面以TCP请求为例,TCP和HTTP连接类似。使用google的goproxy镜像,该镜像会在8080端口开放TCP socket连接,使用如下的配置文件:我们用探针去访问8000端口查看pod状态;此时理论上应该无法连接:可以看到readiness探针会每隔10s监测,无法访问时会将pod置于unready状态,liveness探针20s监测,无法成功则重启pod。 通过以上演示我们了解了如何配置两种探针和执行三种操作。通过合理的探针配置,可以实时监控Istio各个pod的运行状态,提供方便的应用治理手段。相关服务请访问https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019
-
前言在Istio的世界里,如果想把外部的请求流量引入网格,你需要认识并会学会配置Istio Ingress Gateway什么是Ingress Gateway由于Kubernetes Ingress API只能支持最基本的HTTP路由,使用Kubernetes Ingress资源来配置外部流量的方式不能满足需求。因此Istio v1alpha3 routing API引入新的Istio Ingress Gateway取代Kubernetes Ingress。Gateway为HTTP/TCP流量配置了一个负载均衡,用于承载网格边缘的进入和发出连接。在同一个网格中可以有多个不同的gateway存在。这一规范中描述了一系列开放端口,以及这些端口所使用的协议、负载均衡的 SNI 配置等内容。用户可以利用标准的Istio 路由规则控制HTTP和TCP请求进入网格。从下图可以看到Istio gateway在整个网格中的使用情况:如何配置Gateway控制Ingress流量如果你已经安装好了bookinfo的应用,为了能在外部访问bookinfo中的productpage服务,只需要配置Gateway和相关的VirtualService。用一个简单的gateway配置一个负载均衡使访问bookinfo.com的外部http流量能够进入网格:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - hosts: - bookinfo.com port: number: 80 name: http protocol: HTTP为了配置相应的路由,需要为相同的host定义一个VirtualService 并且用配置中gateways的字段绑定到刚才创建的Gateway:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - bookinfo.com gateways: - bookinfo-gateway # <---- 绑定gateway - mesh # <----对内部通信进行流量控制 http: - match: - uri: exact: /productpage route: - destination: host: productpage port: number: 9080这样就达到了在外网开放productpage服务的目的。如何用HTTPS加密Gateway?我们也可以为服务启用TLS保护,以HTTPS的形式对网格外提供服务。首先需要使用工具生成客户端和服务器端的证书和密钥。然后使用密钥和证书作为输入,创建一个Secret。$ kubectl create -n istio-system secret tls istio -ingressgateway-certs --key key.pem --cert cert.p em接下来修改Gateway对象,为Ingress gateway开放一个443端口,用于提供HTTPS服务:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - hosts: - bookinfo.com port: number: 80 name: http protocol: HTTP - hosts: - "*" port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE serverCertificate: /etc/istio/ingressgateway-certs/tls.crt privateKey: /etc/istio/ingressgateway-certs/tls.key这样简单的配置就可以通过HTTPS协议访问bookinfo.com了。
-
故障注入测试故障注入测试顾名思义就是当被测试应用部分组件或功能出现潜在故障时其本身的容错机制是否正常工作,以达到规避故障保证正常组件或功能的使用。Istio提供了HTTP故障注入功能,在http请求转发的过程中,用户可以设定一个或多个故障。故障注入的修改作用于Virtual Service,共有两种不同的故障模式abort和delay。类型所属描述abortHTTPFaultInjection.Abort中断Http请求并且返回既定的错误状态码给请求方delayHTTPFaultInjection.Delay按预设的时延返回Http请求响应为了方便大家理解本文内容,我们预先部署了bookinfo示例。图中是原来完整的 virtualservice,设置了当cookie满足user=vip时,reviews的请求会流入v4版本,其余都会流入v1版本。中断故障当用户对某个负载注入了中断故障时,对于访问该负载的http请求,都会收到预先设定的错误状态码而不会收到正确内容的响应。图中的yaml截取于reviews的virtualservice文件。我们可以看到对于版本v1的路由规则里多了一条fault对象。这个fault对象中,则包含了设定的故障属性。可以解读为,v1版本添加abort故障并且设定返回的http状态码为501,percent设定为100这意味着所有访问v1的请求都会收到501的http响应,显而易见如果这里设成50则只有一半的请求会收到501响应,另一半则会收到正常的响应。如果我们访问productpage只能看到基本的报错信息,并不能确定,这到底是我们预设的中断故障起作用了,还是某种原因导致服务“崩了”。为了确定是我们人工导致的服务中断,而不是其他,我们必须直接访问reviews。给Reviews组件配置外部ip,打开浏览器,并且按下F12,选择network,在地址栏中输入“地址/reviews/0”,network中会有一项红色报错信息,点开则可以看到我们预设的501报错状态码。至此中断故障已经成功注入。删除则只需将fault对象直接清除掉即可。如果这时候我们去访问v4,将cookie设为user=vip可以看到这时的reviews可以正常的显示。延时故障注入除了刚才延时的中断服务故障,延时故障也可以手动注入组件中。刚才使用的bookinfo示例中有两个版本v1和v4。我们已经给v1版本注入了中断故障,现在我们给v4版本注入延时故障,设定时间延迟为2秒,并且所有访问v4的请求都会有2秒的延迟。如上,我们打开product page 以及 reviews page 来验证一下:从这里我们可以看到product page 响应2.39秒Reviews page的响应2.27s我们用例子介绍了两种基本故障注入的方式接下来我们看一些其他的故障注入例子Virtual Service 例子1:在这个例子中,当cookie满足user=vip时会触发延时故障,2秒延时后访问v4版本,当user=svip的时候则会触发中断故障,当cookie不满足以上两个条件时,则可以正常访问v1版本。Virtual Service 例子2:在这个例子中不论cookie符合vip还是svip,亦或是都不符合两个条件,都可以正常的访问到v1版本。这是由于route对象放在了第一个,没有任何匹配条件,不管cookie值是什么都“满足条件”,所以所有的流量不加任何处理直接会流向版本v1,这里要特殊提醒下,如若自己手动添加故障注入一定要注意相对顺序,否则可能不会出现你想设定的结果。Virtual Service 例子3:这个virtual service中我们对同一个版本注入了两个不同的故障,满足任何一个条件都可以触发相应的故障,如果所有条件都不满足则会默认的正常访问v1版本。那么问题来了,如果我没有配置最后一条route,出现了一条既不符合中断故障匹配条件,也不符合延时故障匹配条件,请求会走向哪里呢?对于这种yaml设置,结果异常的简单直白,如果请求不符合任何条件,则会直接获得404的响应,不会自动流入任何其他的版本。 故障注入测试为应用在上线前提供了完备的可靠性测试,istio为使用者进行故障注入提供了极大地便捷,在正确的地方添加3-4行配置而不用修改应用代码即可进行故障注入测试。希望有更多的人可以利用istio故障注入功能提供的便捷来提高自己的研发和测试效率。
-
Q:用Postman测试接口可以调通过,swagger-ui页面测试我的接口经常出现connect: connection timed out.A:确认下frontend跟你的应用网络是否通,servicecomb的swagger-ui现在是proxy模式,不是直连Q:准备使用servercomb,下载了center和demo项目,demo项目一直提示ERROR 9868 --- [ntloop-thread-0] o.a.s.s.client.http.RestUtils ......message: Connection timed out求指点A:1.httpaddr/httpport of your service center conf2.service registry address in your microservice.yamlQ:restschema与rpcschema两种方式在性能上有区别吗?A:@RestSchema 注解用于 SpringMVC 和 JAX-RS 两种服务开发风格,而 @RpcSchema 注解用于透明RPC开发风格,这两种注解的差异主要体现在服务端代码开发风格和契约生成模式上。Java-Chassis有一个隐式契约功能,可以让框架根据服务端接口代码自动生成服务契约。由于 SpringMVC 和 JAX-RS 开发风格会在REST接口上打上各种注解,有利于框架生成更符合REST风格的契约;而透明RPC模式由于接口上没有注解,Java-Chassis框架无法确定接口语义以及各个参数在HTTP请求中的位置,因此所有的接口都会作为 POST 接口处理,请求参数都会包装到HTTP请求的body中。这样的契约不太符合REST风格。因此,Java-Chassis更推荐用户使用 @RestSchema 注解开发服务端接口,这样用户只需要写代码,就能让框架自动生成符合REST风格的服务契约。Java-Chassis的传输模型和编程模型是解耦合的。传输模型方面,Java-Chassis支持REST和highway,其中REST又分为以Vert.x作为底层通信框架的REST over Vertx和以Tomcat之类的servlet容器为底层通信框架的REST over Servlet。Java-Chassis的性能主要受传输模型的影响。当用户选择了一个确定的传输模型后,无论他在服务端选择的是哪种编程模型性能都是差不多的。最后,Java-Chassis在客户端代码开发风格上提供了RPC开发模式和RestTemplate开发模式,在其他条件完全相同的情况下,RPC开发模式的性能比RestTemplate高,因此更推荐使用RPC模式编写consumer端代码。http://zhibo.huaweicloud.com/?referVisitorId=oiOYo0XLXIVOMO-ACc9q2cKXGOFQ&c=activity&a=live&id=151108&from=timeline&isappinstalled=0这里视频有说明性能比较数据Q:Caused by: java.lang.IllegalStateException: The schema(id=[calculatorRestEndpoint]) content held by this instance and the service center is different. You need to increment microservice version before deploying. Or you can configure service_description.environment=development to work in development environment and ignore this error 在bmi例子上做修改,报上面这个错,怎么解决啊?A:这通常是因为你修改了REST接口定义,但是既没有升级微服务版本号,也没有把环境配置成开发环境,所以ServiceComb启动实例检查契约的时候发现契约内容不一致,就报错了。可以考虑升级一下微服务版本号,或者在microservice.yaml文件里面配置一下service_description.environment=development,或者等sc里面的服务实例下线后,把微服务信息删掉重新注册。Q:有谁知道吗?除了注解方式@RequestHeader,还有什么方法可以在Controller中拿到request中的header参数?目前测试发现HttpServletRequest没法拿到A:如果这个Header参数定义在了你的接口契约里,那你的REST接口方法能直接拿到header参数。否则可以扩展一个HttpServerFilter从requestEx参数里面拿header,也可以在你的REST接口里面加上HttpServletRequest参数,从里面拿到headerQ:如何将一个服务部署多个,实现自动减压的?是在配置文件上设置,还是使用其他工具实现。给个链接谢谢。A:https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.htmlQ:The Service pv-web's instance 62d30daeed5011e8af2f00e081ba3ef7 has been isolated for a while, give a single test opportunity. org.apache.servicecomb.loadbalance.filter.IsolationDiscoveryFilter.allowVisit(IsolationDiscoveryFilter.java:119)?A:你贴出来的日志表示pv-web服务的某个实例被隔离了,现在已经经过了一段时间,Java-Chassis框架在尝试将一个请求路由到该实例,看看它能否被调通,如果调通了的话,这个实例就会从隔离状态恢复过来。https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/loadbalance.html 请参考这篇文档的“实例隔离功能”。Q:启动ServiceComb-java-chassis项目 sample/codefirst-sample 目录里的 CodeFirstProviderMain,例子程序怎么启动不起来?Caused by: java.lang.NoSuchMethodError: org.apache.commons.lang3.reflect.MethodUtils.getMethodsWithAnnotation(Ljava/lang/Class;Ljava/lang/Class;ZZ)[Ljava/lang/reflect/Method; at org.apache.servicecomb.foundation.common.event.SimpleEventBus.collectSubscribers(SimpleEventBus.java:41) at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) at org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx.computeIfAbsent(ConcurrentHashMapEx.java:56) at org.apache.servicecomb.foundation.common.event.SimpleEventBus.register(SimpleEventBus.java:51) at org.apache.servicecomb.serviceregistry.task.AbstractTask.<init>(AbstractTask.java:38) at org.apache.servicecomb.serviceregistry.task.AbstractRegisterTask.<init>(AbstractRegisterTask.java:28) at org.apache.servicecomb.serviceregistry.task.MicroserviceRegisterTask.<init>(MicroserviceRegisterTask.java:47) at org.apache.servicecomb.serviceregistry.task.MicroserviceServiceCenterTask.<init>(MicroserviceServiceCenterTask.java:28) at org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry.createServiceCenterTask(AbstractServiceRegistry.java:201) at org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry.init(AbstractServiceRegistry.java:106) at org.apache.servicecomb.serviceregistry.registry.RemoteServiceRegistry.init(RemoteServiceRegistry.java:54) at org.apache.servicecomb.serviceregistry.RegistryUtils.init(RegistryUtils.java:66) at org.apache.servicecomb.core.CseApplicationListener.setApplicationContext(CseApplicationListener.java:48) at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:121) at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:97) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1622) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.d**ateBean(AbstractAutowireCapableBeanFactory.java:555) ... 13 moreA:用户本地工程的lang3包没有更新到ServiceComb配套的版本,解决方法:1.在用户本地工程的pom.xml点击鼠标右键,选择执行 maven -> reimport2.在用户本地工程的pom.xml点击鼠标右键,选择执行 maven -> Show effective pom,确认其中的lang3是:<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.6</version> </dependency>Q:ServiceComb配置中心支持“配置更新后自动刷新到服务”,如果服务有多个节点,是如何实现的?想来如果是API调用刷新不能确定刷到每个节点,是否cse client端有消息流和配置中心连接呢?类似于企业总线。如果是消息总线,那么业务服务里,需要配置消息总线的url等信息吗? A:微服务需要配置中心地址。定期pull配置,或者建立websocket链接采用push机制Q:在 ServiceComb-CRM-WorkShop 例子中 边缘服务afterReceiveRequest方法 在调用String userName = template.getForObject("cse://"+USER_SERVICE_NAME + "/validate?token={token}", String.class, token)时候,第一次调用正常后边调用会出现阻塞线程问题,报错:Thread Thread[transport-vert.x-eventloop-thread-4,5,main] has been blocked for 5433 ms, time limit is 2000A:ServiceComb的Edge Service默认工作于高性能的reactive模式,此模式要求工作于Edge Service转发流程中的业务代码不能有任何的阻塞操作。该问题是由于用户业务模型无法满足reactive要求,因此,可以通过修改微服务的配置文件,使用ServiceComb提供的同步线程池模式解决。使用指南可以参考:https://docs.servicecomb.io/java-chassis/zh_CN/edge/by-servicecomb-sdk.htmlQ:spring mvc项目中实现的filter,切换到微服务后,全部不起作用了,是不支持springmvc里边的filter了吗?用户工程同时添加了springboot和provider-springmvc的依赖:<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>spring-boot-starter-provider</artifactId> </dependency> <!-- springmvc支持 --> <dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>provider-springmvc</artifactId> </dependency>A:问题原因是因为springmvc和ServiceComb REST是两套不同架构,用户将基于springmvc的项目切换到ServiceComb后,还需要基于ServiceComb REST规则对老的filter做微调,ServiceComb提供相关的架构迁移案例,详情可以参考:1.不同框架之间迁移改造可能工作量的评估指南:https://bbs.huaweicloud.com/blogs/ba7b62178cb811e89fc57ca23e93a89f 可以参考下2.在Spring Boot中使用ServiceComb:https://huaweicse.github.io/cse-java-chassis-doc/using-cse-in-spring-boot/using-cse-in-spring-boot.htmlQ:ServiceComb支持thymeleaf吗?A:这个是个web框架,需要在web容器里面运行,其实和servicecomb是两个完全独立的东西了。servicecomb也支持在web容器里面运行,理论上两个都可以放到一起跑,但我们没用过这个框架。 https://docs.servicecomb.io/java-chassis/zh_CN/build-provider/protocol/rest-over-servlet.htmlQ:原来的那些过滤器都失效了,怎么做才可以既保持原有的能力,又可以把需要发布的接口通过@RestSchema申明出去?A:因为是两个不同的运行时,涉及到“框架内部机制”,而不仅仅是“形式”上的东西。 结合功能,一般都有对应的解决方案的。附上一个简单的不同框架之间迁移改造可能工作量的评估指南: https://bbs.huaweicloud.com/blogs/ba7b62178cb811e89fc57ca23e93a89f 可以参考。 Q:群里有人压过 servicecomb 同步restful 和 spring boot的restful的差距吗?A:网上有很多对比分析,我们也有测试过。一般标准的虚拟机4u8g,差不多分别是5万单位和1万单位。servicecomb restful和其它rpc框架,比如grpc,dubbo,tars等在一个差不多的水准,即5万单位。和调优方式,测试方法不同,会有一些偏差。Q:蓝云上安装了mysql,启动alpha的jar包,直接跑saga源码里的saga-servicecomb-demo,能成功体验事务,照着saga源码里的saga-servicecomb-demo写了个一模一样的工程,是springboot接入servicecomb,调用却出了问题,子事务那边报空指针异常,globalTxId,parentTxId都为null, localTxId有值;自己没找出原因,谁了解这块的帮个忙看下吧,代码地址是:https://github.com/weichao666/sagademoA:saga demo的那个问题解决了,如果使用java chassis1.0.0版本,需要引入guava20.0版本,否则启动报错,注解和调用链正确配置的情况下,使用java chassis1.1.0-SNAPSHOT版本是没问题的,java chassis1.0.0版本使用的guava是19.0Q:ServiceComb中的同步 restful 需要特殊配置吗?A:除edge service之外,ServiceComb的restful默认都是同步的,不需要特殊配置。今天的FAQ精选问题总计20个,可以手动收藏一下哦~And小蜜蜂欢迎来我们社区提问笔芯关注我们~
-
一、ElasticSearch的介绍1、简介(官网:https://www.elastic.co/) ElasticSearch是一款基于Luncene的实时分布式搜索和分析引擎。采用java编写,目标是让全文搜索变得简单(应用倒排索引),还可以进行大规模的横向扩展,支持PB级的结构化和非结构化海量数据的处理。(支持json格式文件)2、ElasticSearch与MySQL对比 3、Rest简介 REST全称Representational State Transfer。是一种软件的架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。其实说白了就是类似HTTP的访问,和HTTP非常的相似。REST操作: GET:获取对象的当前状态; PUT:改变对象的状态; POST:创建对象; DELETE:删除对象; HEAD:获取头信息。4、CURL简介 curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的认为是可以在命令行下面访问url的一个工具。curl: -X 指定http的请求方法 有HEAD GET POST PUT DELETE -d 指定要传输的数据 -H 指定http请求头信息基本命令:1、创建索引库(相当于创建数据库)curl -XPUT 'http://qyl01:9200/qyl' 2、创建索引1)创建index=1的数据(post方式)curl -H "Content-Type:application/json" -XPOST 'http://qyl01:9200/qyl/product/1' -d '{"name" : "hadoop", "author" : "Doug Cutting","version":"2.7.6"}' 2)创建index=2的数据(put方式) curl -H "Content-Type:application/json" -XPUT 'http://qyl01:9200/qyl/product/2' -d '{"name" : "hive", "author" : "qyl","version":"100.100.100"}' put和post的区别1)put是幂等方法,post不是,所以put用于用户数据更新,post用于新增比较合适2)创建操作可以使用post,也可以使用Put,区别就在于post是作用的一个集合资源之上的,而Put操作是作用在一个具体资源之上的,比如说很多资源使用数据库自增主键作为标识信息,这个时候就需要使用Put了。3、查询1)查询qyl索引库下,类型为product的index=1的数据 curl -XGET http://qyl01:9200/qyl/product/1?pretty2)检索文档中的一部分,显示特定的字段内容 curl -XGET 'http://qyl01:9200/qyl/product/1?_source=name,author&pretty' 3)获取source的数据curl -XGET 'http://qyl01:9200/qyl/product/1/_source?pretty'4)查询所有curl -XGET 'http://qyl01:9200/qyl/product/_search?pretty'4、更新1)局部更新 :(如果存在就会替换原来的_source中的数据,_version会加1 )curl -H "Content-Type:application/json" -XPOS http://qyl01:9200/qyl/product/1 -d'{"name" : "apache-hadoop"}‘2)真正的局部更新 curl -H "Content-Type:application/json" -XPOST http://qyl01:9200/qyl/product/1/_update -d'{"doc":{"name" : "hadoop", "author" : "qyl","version":"2.7.6"}}'5、删除curl -H "Content-Type:application/json" -XDELETE http://qyl01:9200/qyl/product/3/6、查看数据curl -H "Content-Type:application/json" -XGET 'http://qyl01:9200/account/bank/_search?pretty' 二、ElasticSearch的安装1、流程 前提:必须要安装在普通用户下面,在2.0x之后不支持root安装!1)解压 tar -zxvf soft/elasticsearch-6.2.0.tar.gz -c app/2)重命名mv elasticsearch-6.2.0/ elasticsearch3)修改配置文件 $ES_HOME/conf/elasticsearch.yml cluster.name: qyl-1807 node.name: hadoop node.attr.rack: rack-1805 path.data: /home/qyl/data/elasticsearch path.logs: /home/qyl/logs/elasticsearch bootstrap.memory_lock: false bootstrap.system_call_filter: false network.host: qyl014)启动bin/elasticsearch -d2、出现的问题1)内核版本不行:解决方案,修改内核版本a.查看内核 : uname -ab.升级nss : yum -y update nssc.导入pubic key: sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgd.升级内核版本: sudo rpm -Uvh https://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpme.编辑grub.conf文件: sudo vim /etc/grub.conff.重启虚拟机: reboot 2)启动时,提示内存不够a. 在limits.conf 添加类似如下内容sudo vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 b.进入/etc/security/limits.d/目录下修改配置文件 90-nproc.confc.修改sudo vim /etc/sysctl.conf添加如下内容: vm.max_map_count=262144d.生效 : sudo sysctl -p 3.启动集群1.集群的配置: 修改$ES/config/elasticsearch.yml 文件(每个节点都得改)# limit.bootstrap.system_call_filter: false# Elasticsearch performs poorly when the system is swapping the memory.## ---------------------------------- Network -----------------------------------## Set the bind address to a specific IP (IPv4 or IPv6):#network.host: qyl01## Set a custom port for HTTP:##http.port: 9200## For more information, consult the network module documentation.## --------------------------------- Discovery ----------------------------------## Pass an initial list of hosts to perform discovery when new node is started:# The default list of hosts is ["127.0.0.1", "[::1]"] node.master: truenode.data: truediscovery.zen.ping.unicast.hosts: ["qyl01", "qyl02", "qyl03"] #discovery.zen.ping.unicast.hosts: ["host1", "host2"]#"elasticsearch.yml" 92L, 2997C 59,1 70%# on the system and that the owner of the process is allowed to use this# limit.bootstrap.system_call_filter: false# Elasticsearch performs poorly when the system is swapping the memory.## ---------------------------------- Network -----------------------------------## Set the bind address to a specific IP (IPv4 or IPv6):#network.host: qyl01## Set a custom port for HTTP:##http.port: 9200## For more information, consult the network module documentation.## --------------------------------- Discovery ----------------------------------## Pass an initial list of hosts to perform discovery when new node is started:# The default list of hosts is ["127.0.0.1", "[::1]"] node.master: truenode.data: truediscovery.zen.ping.unicast.hosts: ["qyl01", "qyl02", "qyl03"] #discovery.zen.ping.unicast.hosts: ["host1", "host2"]## Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):##discovery.zen.minimum_master_nodes: ## For more information, consult the zen discovery module documentation.## ---------------------------------- Gateway -----------------------------------## Block initial recovery after a full cluster restart until N nodes are started: 2、启动集群(用elasticSearch-head插件)
-
本文内容: 使用mesher对服务进行sidecar模式的代理,并结合zipkin实现对服务的分布式追踪。需求背景: client ---> mesher_client --->mesher_server_A --->server_A --->mesher_server_A --->mesher_server_B--->server_B在此需求背景下,我们希望该请求以一条完整的调用链进行显示,而不是分成client --server_A 和server_A -->server_B两条调用链显示。环境准备(这里只演示本地):1,一个华为云账号,并下载mesher下载2,zipkin下载 3, local-service-center 下载 步骤:1,部署zipkin,本文不详细介绍zipkin部署,可参考zipkin。2 运行server_B及mesher_B2.1 配置microservice.yamlAPPLICATION_ID: mesher service_description: name: server_B # 服务名 version: 1.0 # 服务版本2.2 配置chassis.yaml--- cse: protocols: http: listenAddress: 192.168.0.131:30112 #监听地址,外部地址 service: registry: address: https://cse.cn-north-1.myhuaweicloud.com:443 #如为local-sc请配置为http://127.0.0.1:30100 handler: chain: Consumer: #consumer handlers Provider: incoming: tracing-provider,transport tracing: enabled: true collectorType: zipkin collectorTarget: http://localhost:9411/api/v1/spans #zipkin aderss2.3 配置auth.yamlcse: credentials: accessKey: *** # you ak secretKey: *** # you sk注:ak/sk获取请参考这里,该配置不区分consumer或provider,配置都是相同。如使用local-service-center部署,则不需要该配置2.4 配置环境变量SPECIFIC_ADDRexport SPECIFIC_ADDR=127.0.0.1:82 #用于设置mesher的后端服务地址,即server_B监听地址注:此处请根据本身服务监听地址进行修改2.5 启动mesher./mesher2.6 启动server_B请根据自己本身开发的server_B进行启动,此处需要注意的是,在启动server_B之前需要设置环境变量http_proxy或HTTP_PROXY,该环境变量设置的值为该服务的代理mesher监听地址,在以上配置中http_proxy应设置为export http_proxy=http://192.168.0.131:301123 运行server_A及mesher_A3.1 配置microservice.yamlAPPLICATION_ID: mesher service_description: name: server_A # 服务名 version: 1.0 # 服务版本3.2 配置chassis.yaml--- cse: protocols: http: listenAddress: 192.168.0.131:30111 #监听地址,外部地址 service: registry: address: https://cse.cn-north-1.myhuaweicloud.com:443 #如为local-sc请配置为http://127.0.0.1:30100 handler: chain: Consumer: outgoing: loadbalance,tracing-consumer,transport Provider: incoming: tracing-provider,transport tracing: enabled: true collectorType: zipkin collectorTarget: http://localhost:9411/api/v1/spans #zipkin aderss3.3 配置auth.yaml 请参考 2.33.4 配置环境变量SPECIFIC_ADDRexport SPECIFIC_ADDR=127.0.0.1:81 #用于设置mesher的后端服务地址,即server_A监听地址3.5 启动mesher./mesher3.6 启动server_A此处和启动server_B之前一样,同样需要设置环境变量http_proxy或HTTP_PROXY,详细参考 2.6.4 运行client及mesher_client4.1 配置microservice.yamlAPPLICATION_ID: mesher service_description: name: client # 服务名 version: 1.0 # 服务版本4.2配置chassis.yaml--- cse: protocols: http: listenAddress: 192.168.0.131:30111 #监听地址,外部地址 service: registry: address: https://cse.cn-north-1.myhuaweicloud.com:443 #如为local-sc请配置为http://127.0.0.1:30100 handler: chain: Consumer: outgoing: loadbalance,tracing-consumer,transport tracing: enabled: true collectorType: zipkin collectorTarget: http://localhost:9411/api/v1/spans #zipkin aderss4.3 配置auth.yaml 请参考 2.34.4启动mesher./mesher4.5 启动client 此处和启动server一样,同样需要设置环境变量http_proxy或HTTP_PROXY,详细参考 2.6.5 访问在所有服务以及代理mesher全部启动完成之后,即可正常访问。此处的访问不同于我们以往通过ip+port访问,此处我们可以直接通过服务名(microservice.yaml中的name配置项)。如:server_A和server_B都是向外提供 /hello 接口,此时client 可以通过 http://server_A/hello 对server_A进行访问,server_A可以通过 http://server_B/hello 对server_B进行访问注意:此时的server_A既作为provider又作为consumer,为保证链路的不断,client端发往server_A请求中的header,同时需要将其放在server_A发往server_B的请求中,此部分需要在业务代码中完成5.1 调用成功之后,访问 http://localhost:9411/zipkin/ 并进入调用链详细界面可以看到一下界面上图所示为一个完整调用链
-
1 产品概述 SoftRadio是一款PC软件,用来模拟NB-IoT Chipset/Module,同时屏蔽NB IoT Air Interface,提供一条通路直接到IoT平台。 在测试场景下,合伙伙伴在不需要芯片/模组、NB-IoT基站和核心网的情况下,借助PC端的SoftRadio软件,任何时候都可通过互联网远程连接到华为IOT平台和APP应用,用于NB-IoT终端设备到APPServer端到端的基本功能调试,不受时间和空间以及硬件限制,大大提升调试效率。2 下载SoftRadioSoftRadio下载地址:请百度搜索下载下载完解压后,得到SoftRadio安装包和SoftRadio用户指南注意下载的SoftRadio是完整的,不然会出现安装时报错,目前支持window7、windows10。3 如何激活SoftRadio开发者安装SoftRadio软件后,需要根据ESN信息申请Lincense,并激活软件后才可以使用相应的功能。操作步骤如下:1、 在PC桌面双击SoftRadio快捷图标;2、 当任务栏出现“SoftRadiohas been started”提示时,表明SoftRadio启动成功,但是还不能使用;3、 在浏览器URL中输入http://localhost:8090/,进入SoftRadio界面;4、 在SoftRadio界面左侧导航中单击“License”,进入License Config界面获取ESN号;5、 将获取到的ESM号填入如下示例License申请模板反馈到邮箱softradio@huawei.com,来申请SoftRadio软件License。1个工作日内将得到邮件反馈的“softradio.license”文件。6、 登录http://localhost:8090/上传获取到的“softradio.license”,单击“ActiveLicense”按钮,若激活成功,状态由“NotActive”变为“Actived”。激活成功如图:4 如何配置SoftRadio4.1 配置IoT平台地址1、 SoftRadio启动成功后,在浏览器中输入http://localhost:8090/;2、 (英文界面)在左侧导航栏选择“Platform Config”,(中文界面)选择“IoT平台设置”;3、 在Platform Config界面填写与SoftRadio对接的IoT平台的IP(即SP Protal的IP),端口号为18080,单击“Submit”,完成IoT平台的地址配置。4.2 添加并注册设备1. (英文界面)在SoftRadio左侧导航栏选择“Dashboard”,(中文界面)选择“设备管理”;2. 在Dashboard界面上单击Devices标识旁边的“”,展开AddDevice界面。各项设备信息说明:Node ID:为从IoT平台获取的验证码verifyCode,verifyCode并且必须使用TEST$_UUID(数字、字母、特殊字符)的格式传入参数。verifyCode由NB-IoT终端厂商通过APP应用与IoT平台之间的通信接口获取。“Manufactuer Id” 、“Device Type” 、“Model”信息需要与IoT平台上创建的APP应用信息保持一致,由NB-IoT终端厂商提供。。ProtocolType:固定为“CoAP”。单击“Submit”,提交设备信息。设备信息提交后,在Dashboard界面显示已添加的NB-IoT终端设备信息,且设备状态显示为“Registered”4.3 绑定NB-IoT终端设备设备注册成功后,在Dashboard界面单击绑定按钮“”,完成设备绑定。设备绑定完成后,设备状态变为“Active”。注:设备绑定完成后,如果状态没有变成“Acitve”,则请确认网络状态是否畅通,配置的IoT平台IP地址和端口是否正确,设备信息填写是否有误。
-
1 产品概述 SoftRadio是一款PC软件,用来模拟NB-IoT Chipset/Module,同时屏蔽NB IoT Air Interface,提供一条通路直接到IoT平台。 在测试场景下,合伙伙伴在不需要芯片/模组、NB-IoT基站和核心网的情况下,借助PC端的SoftRadio软件,任何时候都可通过互联网远程连接到华为IOT平台和APP应用,用于NB-IoT终端设备到APPServer端到端的基本功能调试,不受时间和空间以及硬件限制,大大提升调试效率。2 下载SoftRadioSoftRadio下载地址:中文版链接:http://developer.huawei.com/ict/cn/resource/tool?ecologyID=0&productID=0&colname=1&key=softradio&curPage=1&pageNum=10&isOpen=false英文版链接:http://developer.huawei.com/ict/en/resource/tool?ecologyID=0&productID=0&colname=1&key=softradio&curPage=1&pageNum=10&isOpen=false下载完解压后,得到SoftRadio安装包和SoftRadio用户指南注意下载的SoftRadio是完整的,不然会出现安装时报错,目前支持window7、windows10。3 如何激活SoftRadio开发者安装SoftRadio软件后,需要根据ESN信息申请Lincense,并激活软件后才可以使用相应的功能。操作步骤如下:1、 在PC桌面双击SoftRadio快捷图标;2、 当任务栏出现“SoftRadiohas been started”提示时,表明SoftRadio启动成功,但是还不能使用;3、 在浏览器URL中输入http://localhost:8090/,进入SoftRadio界面;4、 在SoftRadio界面左侧导航中单击“License”,进入License Config界面获取ESN号;5、 将获取到的ESM号填入如下示例License申请模板反馈到邮箱softradio@huawei.com,来申请SoftRadio软件License。1个工作日内将得到邮件反馈的“softradio.license”文件。License申请模板6、 登录http://localhost:8090/上传获取到的“softradio.license”,单击“ActiveLicense”按钮,若激活成功,状态由“NotActive”变为“Actived”。激活成功如图:4 如何配置SoftRadio4.1 配置IoT平台地址1、 SoftRadio启动成功后,在浏览器中输入http://localhost:8090/;2、 (英文界面)在左侧导航栏选择“Platform Config”,(中文界面)选择“IoT平台设置”;3、 在Platform Config界面填写与SoftRadio对接的IoT平台的IP(即SP Protal的IP),端口号为18080,单击“Submit”,完成IoT平台的地址配置。4.2 添加并注册设备1. (英文界面)在SoftRadio左侧导航栏选择“Dashboard”,(中文界面)选择“设备管理”;2. 在Dashboard界面上单击Devices标识旁边的“”,展开AddDevice界面。各项设备信息说明:Node ID:为从IoT平台获取的验证码verifyCode,verifyCode并且必须使用TEST$_UUID(数字、字母、特殊字符)的格式传入参数。verifyCode由NB-IoT终端厂商通过APP应用与IoT平台之间的通信接口获取。“Manufactuer Id” 、“Device Type” 、“Model”信息需要与IoT平台上创建的APP应用信息保持一致,由NB-IoT终端厂商提供。。ProtocolType:固定为“CoAP”。单击“Submit”,提交设备信息。设备信息提交后,在Dashboard界面显示已添加的NB-IoT终端设备信息,且设备状态显示为“Registered”4.3 绑定NB-IoT终端设备设备注册成功后,在Dashboard界面单击绑定按钮“”,完成设备绑定。设备绑定完成后,设备状态变为“Active”。注:设备绑定完成后,如果状态没有变成“Acitve”,则请确认网络状态是否畅通,配置的IoT平台IP地址和端口是否正确,设备信息填写是否有误。转自:https://developer.huawei.com/ict/forum/thread-22773.html
隔壁老坛skr skr~
发表于2018-11-27 11:27:09
2018-11-27 11:27:09
最后回复
隔壁老坛skr skr~
2018-11-27 11:27:09
7353 0 -
1 产品概述 SoftRadio是一款PC软件,用来模拟NB-IoT Chipset/Module,同时屏蔽NB IoT Air Interface,提供一条通路直接到IoT平台。 在测试场景下,合伙伙伴在不需要芯片/模组、NB-IoT基站和核心网的情况下,借助PC端的SoftRadio软件,任何时候都可通过互联网远程连接到华为IOT平台和APP应用,用于NB-IoT终端设备到APPServer端到端的基本功能调试,不受时间和空间以及硬件限制,大大提升调试效率。2 下载SoftRadioSoftRadio下载地址:中文版链接:http://developer.huawei.com/ict/cn/resource/tool?ecologyID=0&productID=0&colname=1&key=softradio&curPage=1&pageNum=10&isOpen=false英文版链接:http://developer.huawei.com/ict/en/resource/tool?ecologyID=0&productID=0&colname=1&key=softradio&curPage=1&pageNum=10&isOpen=false下载完解压后,得到SoftRadio安装包和SoftRadio用户指南注意下载的SoftRadio是完整的,不然会出现安装时报错,目前支持window7、windows10。3 如何激活SoftRadio开发者安装SoftRadio软件后,需要根据ESN信息申请Lincense,并激活软件后才可以使用相应的功能。操作步骤如下:1、 在PC桌面双击SoftRadio快捷图标;2、 当任务栏出现“SoftRadiohas been started”提示时,表明SoftRadio启动成功,但是还不能使用;3、 在浏览器URL中输入http://localhost:8090/,进入SoftRadio界面;4、 在SoftRadio界面左侧导航中单击“License”,进入License Config界面获取ESN号;5、 将获取到的ESM号填入如下示例License申请模板反馈到邮箱softradio@huawei.com,来申请SoftRadio软件License。1个工作日内将得到邮件反馈的“softradio.license”文件。License申请模板6、 登录http://localhost:8090/上传获取到的“softradio.license”,单击“ActiveLicense”按钮,若激活成功,状态由“NotActive”变为“Actived”。激活成功如图:4 如何配置SoftRadio4.1 配置IoT平台地址1、 SoftRadio启动成功后,在浏览器中输入http://localhost:8090/;2、 (英文界面)在左侧导航栏选择“Platform Config”,(中文界面)选择“IoT平台设置”;3、 在Platform Config界面填写与SoftRadio对接的IoT平台的IP(即SP Protal的IP),端口号为18080,单击“Submit”,完成IoT平台的地址配置。4.2 添加并注册设备1. (英文界面)在SoftRadio左侧导航栏选择“Dashboard”,(中文界面)选择“设备管理”;2. 在Dashboard界面上单击Devices标识旁边的“”,展开AddDevice界面。各项设备信息说明:Node ID:为从IoT平台获取的验证码verifyCode,verifyCode并且必须使用TEST$_UUID(数字、字母、特殊字符)的格式传入参数。verifyCode由NB-IoT终端厂商通过APP应用与IoT平台之间的通信接口获取。“Manufactuer Id” 、“Device Type” 、“Model”信息需要与IoT平台上创建的APP应用信息保持一致,由NB-IoT终端厂商提供。。ProtocolType:固定为“CoAP”。单击“Submit”,提交设备信息。设备信息提交后,在Dashboard界面显示已添加的NB-IoT终端设备信息,且设备状态显示为“Registered”4.3 绑定NB-IoT终端设备设备注册成功后,在Dashboard界面单击绑定按钮“”,完成设备绑定。设备绑定完成后,设备状态变为“Active”。注:设备绑定完成后,如果状态没有变成“Acitve”,则请确认网络状态是否畅通,配置的IoT平台IP地址和端口是否正确,设备信息填写是否有误。转自:https://developer.huawei.com/ict/forum/forum.php?mod=viewthread&tid=22773&fromuid=4000811
隔壁老坛skr skr~
发表于2018-11-09 14:26:07
2018-11-09 14:26:07
最后回复
隔壁老坛skr skr~
2018-11-09 14:26:07
5980 0 -
问题背景和描述报告 ALPN not available 分两种场景:第一种场景:初始化 HTTP 2 Client 的时候。 CSE (ServiceComb Java Chassis) 默认会初始化 HTTP 2 Client,方便和启用了 HTTP 2 协议的 Provider 进行通信。 io.vertx.core.VertxException: ALPN not available for JDK SSL/TLS engine at io.vertx.core.net.impl.SSLHelper.resolveEngineOptions(SSLHelper.java:88) at io.vertx.core.net.impl.SSLHelper.<init>(SSLHelper.java:134) at io.vertx.core.http.impl.HttpClientImpl.<init>(HttpClientImpl.java:131) at io.vertx.core.impl.VertxImpl.createHttpClient(VertxImpl.java:317) at org.apache.servicecomb.foundation.vertx.client.http.HttpClientPoolFactory.createClientPool(HttpClientPoolFactory.java:36) at org.apache.servicecomb.foundation.vertx.client.http.HttpClientPoolFactory.createClientPool(HttpClientPoolFactory.java:27) at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.createClientPool(ClientPoolManager.java:60) at org.apache.servicecomb.foundation.vertx.client.ClientVerticle.start(ClientVerticle.java:35) at io.vertx.core.AbstractVerticle.start(AbstractVerticle.java:106) at io.vertx.core.Verticle.start(Verticle.java:66) at io.vertx.core.impl.DeploymentManager.lambda$doDeploy$8(DeploymentManager.java:556)这种场景报告的错误在没有使用 HTTP 2 的情况下都可以忽略,不用处理。可以通过下面的配置项关闭 HTTP2 客户端的 ALPN:servicecomb.rest.client.http2.useAlpnEnabled: false如果使用 servicecomb-java-chassis 2.0.2 及其以上版本,还可以使用如下配置项,不初始化 HTTP 2客户端。servicecomb.rest.client.http2.enabled: false第二种场景:初始化 HTTP 2 Server 的时候。 CSE (ServiceComb Java Chassis) 默认不会启用 HTTP 2 Server。 用户需要通过配置项开启 HTTP2, 分为 H2 和 H2C两种模式, 如果使用 H2 模式 ( SSL),必须开启ALPN, 可能报告如下错误。 启用 H2 的配置参考: https://docs.servicecomb.io/java-chassis/zh_CN/transports/http2/io.vertx.core.VertxException: ALPN not available for JDK SSL/TLS engine at io.vertx.core.net.impl.SSLHelper.resolveEngineOptions(SSLHelper.java:88) at io.vertx.core.net.impl.SSLHelper.<init>(SSLHelper.java:155) at io.vertx.core.http.impl.HttpServerImpl.<init>(HttpServerImpl.java:93) at io.vertx.core.impl.VertxImpl.createHttpServer(VertxImpl.java:308) at org.apache.servicecomb.transport.rest.vertx.RestServerVerticle.createHttpServer(RestServerVerticle.java:247) at org.apache.servicecomb.transport.rest.vertx.RestServerVerticle.start(RestServerVerticle.java:99) at io.vertx.core.Verticle.start(Verticle.java:66) at io.vertx.core.impl.DeploymentManager.lambda$doDeploy$8(DeploymentManager.java:556)如果使用 H2C 模式, 不需要启用 ALPN,可以通过下面的配置项关闭:servicecomb: server: http2: useAlpnEnabled: false可能原因和解决方案CSE 提供两种方式使用 ALPN, 第一种是 openssl, 第二种是 JDK 原生 SSL。 默认使用原生 SSL, 使用 openssl 需要加上下面的配置项:ssl.engine: openssl在使用 opensssl 时可能的原因* netty 和 boringssl 版本不匹配。或者 netty-tcnative-boringssl-static-*.jar 没有包含对应操作系统的库文件,比如 ARM 环境。 CSE 3.0.0 版本在 foundation-auth 模块包含了 ARM 版本的库文件, 其他环境的库文件在 netty-tcnative-boringssl-static-*.jar 压缩包中。 * 操作系统 openssl 版本过低也可能导致这个问题。 使用 JDK 原生 SSL 时可能的原因* alpn 和 JDK 的版本不匹配,或者没有正确使用安装 ALPN 包。 CSE 默认没有携带 ALPN 包, 需要开发者自行配置。 参考: https://www.eclipse.org/jetty/documentation/current/alpn-chapter.html#alpn-versions 获取 JDK的对应版本;参考: https://github.com/Blazemeter/jmeter-http2-plugin/blob/master/README.md 了解如何配置。* 本机的JDK版本和操作系统版本位数不一样HTTP2和JDK8配合使用建议JDK8的HTTP2支持不是很好,在实际项目中,发现每次JDK的版本升级,都导致HTTP2支持有些变更,报告一些非常奇怪的错误,给开发者定位带来诸多不便。 如果使用JDK8和HTTP2,建议使用openssl,配置文件中指定:ssl.engine: openssl
-
分场景。如果是tomcat场景,可以参考tomcat配置。如果是vert.x的HTTP服务器,下面几个参数可以参考:servicecomb.uploads.maxSize : 设置body的限制大小。servicecomb.rest.server.maxHeaderSize: 设置请求header大小限制。servicecomb.rest.server.maxInitialLineLength: 设置HTTP请求的第一行长度限制。(即URL)
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签