指标

  • 运行examples上面的 sofa-rpc 服务
  • 学习文档,联合 sofa 插件,发动 http 申请 soul 网关,体验 sofa 代理

soul 网关接入 sofa 利用

  • 参考官网文档:https://dromara.org/zh-cn/doc...

    • 引入相干依赖

      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>2.2.1</version>       </dependency>

      soul-examples-sofa新增如下依赖:

                <dependency>      <groupId>org.dromara</groupId>            <artifactId>soul-spring-boot-starter-client-sofa</artifactId>            <version>2.2.1</version>            <exclusions>                <exclusion>                    <artifactId>guava</artifactId>                    <groupId>com.google.guava</groupId>                </exclusion>            </exclusions>        </dependency>
    • application.yml增加相干配置

      soul:  sofa:    adminUrl: http://localhost:9095    contextPath: /sofa    appName: sofa      # adminUrl: 为你启动的 soul-admin 我的项目的ip + 端口,留神要加 http://      # contextPath: 为你的这个我的项目在soul网关的路由前缀,比方/order ,/product 等等,网关会依据你的这个前 缀来进行路由.      # appName:你的利用名称,不配置的话,会默认取 sofa 配置中application 中的名称
  • sofa 插件设置

    soul-admin 插件治理中,sofa 插件设置为开启

    sofa 插件中配置你的注册地址

  • 接口注册到网关

    • sofa 服务实现类的办法上加上 @SoulSofaClient 注解,示意该接口办法注册到网关
  • 先启动zk,而后再启动TestSofaApplication,输入日志 init sofa client reference success,示意sofa接口曾经公布到 soul 网关

sofa 用户申请以及参数阐明

sofa 参数传递形式:

  • 通过 http post 形式拜访网关,通过body,json类型传递
  • 单个java bean参数类型 (默认)
  • 自定义实现多参数反对:

    • 在你搭建的网关我的项目中,新增一个类 A,实现 org.dromara.soul.plugin.api.sofa.SofaParamResolveService

      public interface SofaParamResolveService {       /**        * Build parameter pair.        * this is Resolve http body to get sofa param.        *        * @param body           http中body传的json字符串         * @param parameterTypes 匹配到的办法参数类型列表,如果有多个,则应用,宰割        * @return pair left为参数类型,right为参数值        */       Pair<String[], Object[]> buildParameter(String body, String parameterTypes);   }
  • 通过 http post 形式拜访网关,通过body,json类型传递

应用 http post 形式拜访,后盾NullPointerException

打断点,调试

         GenericService genericService = reference.refer();        Pair<String[], Object[]> pair;        if (null == body || "".equals(body) || "{}".equals(body) || "null".equals(body)) {            pair = new ImmutablePair<>(new String[]{}, new Object[]{});        } else {            // body 不为空            pair = sofaParamResolveService.buildParameter(body, metaData.getParameterTypes());        }

body 不为空时,调用了sofaParamResolveService.buildParameter(String body, String parameterTypes)办法,但在官网介绍中,只有自定义实现多参数反对才须要实现org.dromara.soul.plugin.api.sofa.SofaParamResolveService类,不晓得这块是不是个BUG。代码中搜了搜,发现只在SofaProxyServiceTest类中以动态外部类形式实现了`sofaParamResolveService

先实现下`sofaParamResolveService试下后果

public Pair<String[], Object[]> buildParameter(final String body, final String parameterTypes) {        Map<String, Object> paramMap = GsonUtils.getInstance().toObjectMap(body);        String[] parameter = StringUtils.split(parameterTypes, ",");        if (parameter.length == 1 && !isBaseType(parameter[0])) {            for (String key : paramMap.keySet()) {                Object obj = paramMap.get(key);                if (obj instanceof JsonObject) {                    paramMap.put(key, GsonUtils.getInstance().convertToMap(obj.toString()));                } else if (obj instanceof JsonArray) {                    paramMap.put(key, GsonUtils.getInstance().fromList(obj.toString(), Object.class));                } else {                    paramMap.put(key, obj);                }            }            return new ImmutablePair<>(parameter, new Object[]{paramMap});        }        List<Object> list = new LinkedList<>();        for (String key : paramMap.keySet()) {            Object obj = paramMap.get(key);            if (obj instanceof JsonObject) {                list.add(GsonUtils.getInstance().convertToMap(obj.toString()));            } else if (obj instanceof JsonArray) {                list.add(GsonUtils.getInstance().fromList(obj.toString(), Object.class));            } else {                list.add(obj);            }        }        Object[] objects = list.toArray();        return new ImmutablePair<>(parameter, objects);    }    private boolean isBaseType(final String paramType) {        return paramType.startsWith("java") || paramType.startsWith("[Ljava");    }

再次运行,胜利:

次要理解了一下 soul 网关接入 Sofa 利用,应用各种申请参数通过 http 申请 soul 网关,体验 sofa 代理。