Apache ServiceComb | 精选
新
年
今天是农历的正月十一
结束了春节假期的小蜜蜂在家也吃胖了~
相信有很多小伙伴已经回归到工作当中啦:)
在精神抖擞牟足干劲的气氛中,小蜜蜂马不停蹄地给大家带来新一期的Service Comb精选动态~
Apache ServiceComb 致力于帮助企业、用户和开发者将企业应用轻松微服务化上云,并实现对微服务应用的高效运维管理。
快乐
乐
ServiceComb
进展动态
从1月23日开始
我们启动了《每天半小时学习微服务》系列
据透将servicecomb揭秘完为止
FAQ精选问答
Q1
大神们,有办法从服务中心获取微服务所有发布的接口吗?
A
Service-Center的接口文档是使用swagger yaml文件描述的,可以直接从Github代码库获取:
https://github.com/apache/servicecomb-service-center/blob/master/server/core/swagger/v4.yaml
Q2
请问一下,注册到服务中心的实例信息,有办法手动删除吗?我rest注册一个ip和端口,然后我注册一个新的,发现原来老的ip还在里面,过一会才注销的。
A
强制关闭进程时,微服务无法优雅退出,只能由服务中心感知到实例连续心跳失败后将实例删除。默认允许微服务实例连续心跳失败3次,心跳时间间隔30s,因此需要等待(3+1)*30s=2min来让sc下线实例。
如果想要sc及时感知到实例下线,就需要正常关闭实例,此时实例会自动进行优雅停机。优雅停机的相关说明在这里:https://docs.servicecomb.io/java-chassis/zh_CN/general-development/shutdown.html
优雅停机的原理是向JVM注册了一个shutdown hook,在进程退出时JVM会调用此回调函数来进行一系列的停机操作。因此,优雅停机需要用户正常退出进程,不能强制杀进程。
Q3
service-center docker镜像有没有国内的。 公司内网pull不下来?
A
可以通过此链接的“本地轻量化”下载,网址参考:
https://cse-bucket.obs.myhwclouds.com/LocalServiceCenter/local-service-center-2.3.1.6-docker.tar
Q4
pack在tcc的comfirm阶段失败怎么补偿?
A
不会再自动补偿,可以幂等重试。如果超过重试次数,人工处理。目前只是记日志,后续可以配置重试。
Q5
帮忙看下这个问题,不过alpha服务端没报错
我加入了bean的jar后还是报错,使用字符串或者基本类型,还有map来传参数,调用补偿方法都没问题。
报错信息:
2019-01-07 19:25:39.983 WARN 18736 --- [nio-6060-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by handler execution: cn.com.aiidc.hicloud.component.bean.exception.HicloudException
2019-01-07 19:25:40.351 INFO 18736 --- [ault-executor-4] s.p.o.c.g.s.GrpcCompensateStreamObserver : Received compensate command, global tx id: 31c67d8e-1ced-4f70-83b6-7c151186120f, local tx id: a5cc191d-e50b-4c69-bb53-bb61309a1049, compensation method: public boolean cn.com.aiidc.hicloud.demo.service.impl.OrderServiceImpl.cancelCreateOrder(cn.com.aiidc.hicloud.component.bean.vo.order.CreateOrderVo)
2019-01-07 19:25:40.357 ERROR 18736 --- [ault-executor-4] o.a.s.p.o.c.g.c.ReconnectStreamObserver : Failed to process grpc coordinate command.
io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
at io.grpc.Status.asRuntimeException(Status.java:526) ~[grpc-core-1.14.0.jar:1.14.0]
at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:420) [grpc-stub-1.14.0.jar:1.14.0]
A
因为Alpha不会做反序列化的操作,其实添加cn.com.aiidc.hicloud.component.bean.vo.order.CreateOrderVo 这个类到Alpha中意义不大。
引入这个后造成的问题
maven去掉这个之后补偿方法正常调用了。
参考: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-known-restart-limitations
点评:引入spring-boot-devtools 会修改对应的classloader,这样会造成omega寻找对应方法签名时出错。
Q6
麻烦问下我需要在哪里配置saga的数据库连接地址呢?用mysql的时候总是报错。
报错信息:
APPLICATION FAILED TO START
Description:
Failed to bind properties under '' to com.zaxxer.hikari.HikariDataSource:
verclassname
Value: com.mysql.cj.jdbc.Driver
Origin: "driverClassName" from property source "source"
Reason: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader
Action:
Update your application's configuration
A
因为数据库连接属性url里没有配置时区所以解析错误。时区问题是mysql jdbc 在6.0+ 之后就出现的。因为你本机装的是8.0的mysql,可能必须要配置时区。
Q7
Rpc跨应用调用微服务失败是什么原因?
报错信息:
Probably invoke a service before it is registered, or no instance found for it, appId=demo2, name=demo2:demo-service2
我在consumer这端
@RpcReference(microserviceName = "demo2:demo-service2",schemaId = "demo-api2")
private DemoApi2 demoApi2;
参考文章后抛这样的异常
A
Provider端需要开启跨应用调用,Consumer端需要以${AppID}:${microserviceName}的形式指定依赖的provider服务。
具体操作请参考相关资料:
https://docs.servicecomb.io/java-chassis/zh_CN/general-development/cross-app-invocation.html
由于一个服务是否允许跨应用调用是记录在其服务信息内的,因此服务端开启跨app调用后,需要升级微服务版本号作为新版本服务注册到sc,或者将sc内原有的服务记录删除重新注册。
服务端允许跨app调用后,需要升级微服务版本号
你观察启动日志,应该是有报错的。
按道理来说,development 模式下应该重新把注册信息送到注册中心才合理。
sc OK的,开发态重新注册静态信息,只发生在契约变化的场景。
Q8
请问下 saga 是如何判断事务是否成功 / 失败的, 运行期异常吗?
A
如果事务函数能够正常执行并且没有抛出异常或者出现超时的状况,Saga 判断事务执行成功。
其他异常情况处理详见:
http://servicecomb.apache.org/cn/docs/distributed-transaction-of-services-2/
Q9
如果事务补偿方法失败,就只能去 command 中找 payloads 参数人工干预吗?我看里面用的是二进制的序列化后的数据,这里面的数据类型可以修改吗?如果是json的可读性会好一点。
A
你可以定义自己的序列化来实现,你这个提议挺好的,哪些序列化的数据是不能修改的,如果你想扩展可以考虑之前提到的通过数据库的方式保存现场。
目前Pack Tcc实现是直接放在内存里面的。
10
关于omega于现有项目继承的时候出现resttemplate的bean定义冲突问题,有什么推荐的解决办法吗?或者后期是否会考虑在org.apache.servicecomb.pack.omega.transport.resttemplate.RestTemplateConfig声明的时候给bean起个名字?
@Configuration
public class RestTemplateConfig {
@Autowired(required = false)
OmegaContext context;
@Bean(name = "omegaRestTemplate")
public RestTemplate omegaRestTemplate() {
RestTemplate template = new RestTemplate();
List
interceptors.add(new TransactionClientHttpRequestInterceptor(context));
template.setInterceptors(interceptors);
return template;
}
A
这是一个很好的建议,我刚刚为它创建了一个JIRA https://issues.apache.org/jira/browse/SCB-1122
是的,我们有fegin传输插件。https://github.com/apache/servicecomb-pack/tree/master/omega/omega-transport/omega-transport-feign
11
我看到alpha的EventScanner每500毫秒就要扫描一次TxEvent,TxTimeout这会不会导致性能问题?当数据量比较大时我们能做的应该就是表分片了吧,alpha是否有分布式锁或者动态master的能力?当我集群部署alpha的时候不会每个alpha都扫这几个表吧?
A
500毫秒是执行完了之后才出发,如果执行时间超过500毫秒,不会触发下一个任务的。扫描表是一直都在进行的。
12
我本地启动了一个虚拟机跑注册中心,然后启动了两个服务,fristservice作为服务提供者,secondservice作为消费者,但是调的时候报错:
No available address found. microserviceName=fristservice, version=0.0.1, discoveryGroupName=0.0.1/0.0.1+/instancesNoMatch/
A
可以安装ServiceCenter的UI,在前端界面里面看哪些服务注册了。在yaml里面把rest 换成highway。
13
请教下,如果发生了跨域问题,需要如何做呢?我这边本地测试,用的ngrok,用户登录重定向到我本地,让后请求我localhost的服务发生了这个问题:
提示getAccessToken 域名:192.168.1.170:11700
A
https://docs.servicecomb.io/java-chassis/zh_CN/general-development/CORS.html
如果需要启用cors,参考一下这个文档
14
io.vertx.core.impl.BlockedThreadChecker:Thread Thread [transport-vert.x-eventloop-thread-2,5,main]已被阻止5613 ms,时间限制为2000
io.vertx.core.VertxException:线程被阻塞
A
在网络线程中执行同步操作,阻塞了5秒多了,应该已经打了调用栈了,网络线程中是绝对禁止执行同步操作的,阻塞网络线程会影响服务的性能,需要避免此情况。
欢迎大家在ServiceComb讨论群
或者gitter聊天室与我们互动
https://gitter.im/ServiceCombUsers/Lobby
saga聊天室
↓↓↓
https://gitter.im/ServiceCombUsers/Saga
文末小结
我们专注于开源
更希望有更多爱好者学习到微服务
同时也欢迎大家加入到我们的开发队伍
为我们贡献代码,成为commiter
欢迎扫码加入进微信群
有什么疑问可以私聊小助手哈
期待志同道合的朋友们加入
ServiceComb的大门为你们敞开~
用心做开源,不忘初衷
了解更多信息请访问:
官方网站 http://servicecomb.apache.org/
Github代码仓库 https://github.com/apache?q=ServiceComb
赶紧点击阅读原文阅读相关源码 并给ServiceComb点个“Star”吧 |