Sofa服务接入

此篇文章是介绍 sofa 服务接入到 Apache ShenYu 网关,Apache ShenYu 网关使用 sofa 插件来接入sofa服务。

接入前,请正确启动 shenyu-admin,并开启sofa插件,在网关端和sofa服务端引入相关依赖。可以参考前面的 Sofa快速开始

关于插件使用可请参考:Sofa插件

应用客户端接入的相关配置请参考:客户端接入配置

数据同步的相关配置请参考:数据同步配置

在网关中引入 sofa 插件

当前版本,默认已经引入此依赖

  1. 在网关的 pom.xml 文件中增加如下依赖:

    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>sofa-rpc-all</artifactId>
    4. <version>5.7.6</version>
    5. <exclusions>
    6. <exclusion>
    7. <groupId>net.jcip</groupId>
    8. <artifactId>jcip-annotations</artifactId>
    9. </exclusion>
    10. </exclusions>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.apache.curator</groupId>
    14. <artifactId>curator-client</artifactId>
    15. <version>4.0.1</version>
    16. </dependency>
    17. <dependency>
    18. <groupId>org.apache.curator</groupId>
    19. <artifactId>curator-framework</artifactId>
    20. <version>4.0.1</version>
    21. </dependency>
    22. <dependency>
    23. <groupId>org.apache.curator</groupId>
    24. <artifactId>curator-recipes</artifactId>
    25. <version>4.0.1</version>
    26. </dependency>
    27. <dependency>
    28. <groupId>org.apache.shenyu</groupId>
    29. <artifactId>shenyu-spring-boot-starter-plugin-sofa</artifactId>
    30. <version>${project.version}</version>
    31. </dependency>
  2. 重启网关服务。

sofa服务接入网关

可以参考示例:shenyu-examples-sofa

  1. springboot构建,引入以下依赖:

    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>rpc-sofa-boot-starter</artifactId>
    4. <version>${rpc-sofa-boot-starter.version}</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.apache.shenyu</groupId>
    8. <artifactId>shenyu-spring-boot-starter-client-sofa</artifactId>
    9. <version>${shenyu.version}</version>
    10. </dependency>
  2. 在 application.yml 中配置

  1. com:
  2. alipay:
  3. sofa:
  4. rpc:
  5. registry-address: zookeeper://127.0.0.1:2181 # consul # nacos
  6. bolt-port: 8888
  7. shenyu:
  8. register:
  9. registerType: http #zookeeper #etcd #nacos #consul
  10. serverLists: http://localhost:9095 #localhost:2181 #http://localhost:2379 #localhost:8848
  11. props:
  12. username: admin
  13. password: 123456
  14. client:
  15. sofa:
  16. props:
  17. contextPath: /sofa
  18. ipAndPort: sofa
  19. appName: sofa
  20. port: 8888
  1. 在 resources 目录下xml 文件中配置 sofa 服务暴露的服务接口
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:sofa="http://sofastack.io/schema/sofaboot"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  5. http://sofastack.io/schema/sofaboot https://sofastack.io/schema/sofaboot.xsd"
  6. default-autowire="byName">
  7. <!-- 示例 sofa 接口 -->
  8. <sofa:service ref="sofaSingleParamService" interface="org.apache.shenyu.examples.sofa.api.service.SofaSingleParamService">
  9. <sofa:binding.bolt/>
  10. </sofa:service>
  11. <!-- 示例 sofa 接口 -->
  12. <sofa:service ref="sofaMultiParamService" interface="org.apache.shenyu.examples.sofa.api.service.SofaMultiParamService">
  13. <sofa:binding.bolt/>
  14. </sofa:service>
  15. </beans>
  1. 在接口上增加@ShenyuSofaClient注解
  1. @ShenyuSofaClient("/demo")
  2. @Service
  3. public class SofaClientMultiParamServiceImpl implements SofaClientMultiParamService {
  4. @Override
  5. @ShenyuSofaClient("/findByIdsAndName")
  6. public SofaSimpleTypeBean findByIdsAndName(final List<Integer> ids, final String name) {
  7. return new SofaSimpleTypeBean(ids.toString(), "hello world shenyu sofa param findByIdsAndName :" + name);
  8. }
  9. }
  1. 启动sofa服务,成功注册后
  • 进入后台管理系统的 插件列表 -> Proxy -> Sofa,会看到自动注册的选择器、规则信息。
  • 进入后台管理系统的 基础配置-> 元数据管理,搜索appName(通过)可以看到元数据,每一个sofa接口方法,都会对应一条元数据。

sofa用户请求及参数说明

  • 可以通过 http 的方式来请求网关,从而请求到你的 sofa 服务。
    • Apache ShenYu 网关需要有一个路由前缀,这个路由前缀就是接入网关配置的 contextPath

比如你有一个 order 服务 它有一个接口,它的注册路径 /order/test/save

现在就是通过 post 方式请求网关:http://localhost:9195/order/test/save

其中 localhost:9195 为网关的 ip 端口,默认端口是 9195/order 是你sofa接入网关配置的 contextPath

  • 参数传递:

    • 通过 http协议, post 方式访问网关,通过在http body中传入json类型参数。
    • 更多参数类型传递,可以参考 shenyu-examples-sofa 中的接口定义,以及参数传递方式。
  • 单个java bean参数类型 (默认)

  • 自定义实现多参数支持:

    • 在你搭建的网关项目中,新增一个类 MySofaParamResolveService,实现 org.apache.shenyu.plugin.api.sofa.SofaParamResolveService接口。

    ``` public interface SofaParamResolveService {

  1. /**
  2. * Build parameter pair.
  3. * this is Resolve http body to get sofa param.
  4. *
  5. * @param body the body
  6. * @param parameterTypes the parameter types
  7. * @return the pair
  8. */
  9. Pair<String[], Object[]> buildParameter(String body, String parameterTypes);
  10. }
  11. ```
  • bodyhttpbody传的json字符串。

  • parameterTypes: 匹配到的方法参数类型列表,如果有多个,则使用,分割。

  • Pair中,left为参数类型,right为参数值,这是sofa泛化调用的标准。

  • 把你的类注册成Springbean,覆盖默认的实现。

    1. @Bean
    2. public SofaParamResolveService mySofaParamResolveService() {
    3. return new MySofaParamResolveService();
    4. }