Sofa服务接入

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

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

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

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

在网关中引入 sofa 插件

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

  • sofa版本换成你的,引入你需要的注册中心依赖,以下是参考。

    ```

  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>
  32. ```
  • 重启网关服务。

sofa服务接入网关

可以参考:shenyu-examples-sofa

如果是springboot构建,引入以下依赖:

  1. <dependency>
  2. <groupId>org.apache.shenyu</groupId>
  3. <artifactId>shenyu-spring-boot-starter-client-sofa</artifactId>
  4. <version>${shenyu.version}</version>
  5. </dependency>

如果是spring构建,引入以下依赖:

  1. <dependency>
  2. <groupId>org.apache.shenyu</groupId>
  3. <artifactId>shenyu-client-sofa</artifactId>
  4. <version>${shenyu.version}</version>
  5. </dependency>

并在你的 bean定义的xml文件中新增如下 :

  1. <bean id ="sofaServiceBeanPostProcessor" class ="org.apache.shenyu.client.sofa.SofaServiceBeanPostProcessor">
  2. <constructor-arg ref="shenyuRegisterCenterConfig"/>
  3. </bean>
  4. <bean id="shenyuRegisterCenterConfig" class="org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig">
  5. <property name="registerType" value="http"/>
  6. <property name="serverList" value="http://localhost:9095"/>
  7. <property name="props">
  8. <map>
  9. <entry key="contextPath" value="/你的contextPath"/>
  10. <entry key="appName" value="你的名字"/>
  11. <entry key="ifFull" value="false"/>
  12. </map>
  13. </property>
  14. </bean>

sofa 插件设置

  • 首先在 shenyu-admin 插件管理中,把sofa 插件设置为开启。

  • 其次在 sofa 插件中配置你的注册地址或者其他注册中心的地址.

  1. {"protocol":"zookeeper","register":"127.0.0.1:2181"}

接口注册到网关

  • sofa服务的类或者方法上加上 @ShenyuSofaClient 注解,表示该类或接口方法注册到网关。

  • 启动sofa服务提供者,成功注册后,进入后台管理系统的 插件列表 -> rpc proxy -> 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接口。
    1. public interface SofaParamResolveService {
    2. /**
    3. * Build parameter pair.
    4. * this is Resolve http body to get sofa param.
    5. *
    6. * @param body the body
    7. * @param parameterTypes the parameter types
    8. * @return the pair
    9. */
    10. Pair<String[], Object[]> buildParameter(String body, String parameterTypes);
    11. }
  • bodyhttpbody传的json字符串。

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

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

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

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