sofa示例演示
什么是sofa
sofa是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用方案。为了用户和开发者方便的进行功能扩展,SOFARPC 提供了丰富的模型抽象和可扩展接口,包括过滤器、路由、负载均衡等等。同时围绕 SOFARPC 框架及其周边组件提供丰富的微服务治理方案。
功能特性
- 透明化、高性能的远程服务调用
- 支持多种服务路由及负载均衡策略
- 支持多种注册中心的集成
- 支持多种协议,包括 Bolt、Rest、Dubbo 等
- 支持同步、单向、回调、泛化等多种调用方式
- 支持集群容错、服务预热、自动故障隔离
- 强大的扩展功能,可以按需扩展各个功能组件
Soul网关对于sofa的支持
- 在我们网关的项目
soul-bootstrap中增加如下依赖:<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>sofa-rpc-all</artifactId> <version>5.7.6</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.dromara</groupId> <artifactId>soul-spring-boot-starter-plugin-sofa</artifactId> <version>${last.version}</version> </dependency> - 在我们的后台管理系统开启sofa插件
- 首先在 soul-admin 插件管理中,把sofa 插件设置为开启。
- 其次在 sofa 插件中配置你的注册地址或者其他注册中心的地址.
{"protocol":"zookeeper","register":"127.0.0.1:2181"}
sofa示例项目:soul-examples-sofa
- 引入Soul的依赖
<dependency> <groupId>org.dromara</groupId> <artifactId>soul-spring-boot-starter-client-sofa</artifactId> <version>${soul.version}</version> </dependency> - 配置Soul,在yml文件中新增如下配置
soul: sofa: adminUrl: http://localhost:9095 contextPath: /sofa appName: sofa # adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加 http:// # contextPath: 为你的这个项目在soul网关的路由前缀,这个你应该懂意思把? 比如/order ,/product 等等,网关会根据你的这个前缀来进行路由. # appName:你的应用名称,不配置的话,会默认取sofa配置中application 中的名称 - 接口注册到网关
你sofa服务实现类的,方法上加上 @SoulSofaClient 注解,表示该接口方法注册到网关。 - 启动示例项目,输出日志 sofa client register success,且sofa接口已经发布到 soul网关,大功告成。
调试
通过Debug跟踪调用方法,可以发现存在以下的调用链
SoulWebHandler.execute() --> AbstractSoulPlugin.execute() --> SofaPlugin.doExecute() --> SofaProxyService.genericInvoker() --> 调用到我们定义的方法。
前面两步就不看了,是Soul匹配插件的一个过程,我们从SofaPlugin.doExecute()开始看。
- 首先获取Body,里面是我们的参数(如果有参数的话)
- 然后拿到我们注册的MetaData,里面就是我们的方法。

- 如果MetaData为空,或者MateData里面的ServiceName和methodName为空,就返回错误。
- 如果参数类型不为空,但是Body为空,就返回错误。
- 调用SofaProxyService,返回相应。
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
String body = exchange.getAttribute(Constants.SOFA_PARAMS);
SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
assert soulContext != null;
MetaData metaData = exchange.getAttribute

本文详细介绍了Soul网关对SOFA RPC框架的支持,包括SOFA的特性、如何在Soul网关中配置SOFA插件、创建SOFA示例项目并调试。在调试过程中,作者发现并解决了一个可能导致无响应的问题,强调了响应式编程在Soul中的应用。
最低0.47元/天 解锁文章
222

被折叠的 条评论
为什么被折叠?



