Apache ServiceComb 社区1月动态精选

640?wx_fmt=png

Apache ServiceComb | 精选

640?wx_fmt=jpeg

今天是农历的正月十一

结束了春节假期的小蜜蜂在家也吃胖了~

相信有很多小伙伴已经回归到工作当中啦:)


在精神抖擞牟足干劲的气氛中,小蜜蜂马不停蹄地给大家带来新一期的Service Comb精选动态~


Apache ServiceComb 致力于帮助企业、用户和开发者将企业应用轻松微服务化上云,并实现对微服务应用的高效运维管理。

快乐


640?wx_fmt=png

ServiceComb 

进展动态

640?wx_fmt=png


从1月23日开始

我们启动了《每天半小时学习微服务》系列

据透将servicecomb揭秘完为止


640?wx_fmt=png

  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中意义不大。

引入这个后造成的问题<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

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<ClientHttpRequestInterceptor> interceptors = template.getInterceptors();
   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


文末小结

640?wx_fmt=png

我们专注于开源

更希望有更多爱好者学习到微服务


同时也欢迎大家加入到我们的开发队伍

为我们贡献代码,成为commiter


欢迎扫码加入进微信群

有什么疑问可以私聊小助手哈

640?wx_fmt=jpeg

期待志同道合的朋友们加入

ServiceComb的大门为你们敞开~

用心做开源,不忘初衷


了解更多信息请访问: 

官方网站 http://servicecomb.apache.org/ 

Github代码仓库 https://github.com/apache?q=ServiceComb 

640?wx_fmt=png

赶紧点击阅读原文阅读相关源码

并给ServiceComb点个“Star”吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值