Solon v3.0.4

使用分布式发现与注册服务

</> markdown

生态 / Solon Cloud Discovery [传送]

1、情况简介

分布式注册与发现服务,也可叫云端注册与发现服务(一般给 Rpc 架构使用)。

  • 主要通过 CloudDiscoveryService 接口进行适配
  • 使用 CloudClient.discovery() 获取适配实例;从而注册和发现(一般不直接使用。自动的)
  • 还可以借用 LoadBalance.get(group, service) 进行简单发现服务(一般也不直接使用)
  • 支持 discovery.agent.{service} 配置代理(特别适合 k8s 环境)
  • 一般无感知使用

目前适配有:local, water, consul, nacos, zookeeper, polaris 等

2、简单演示

2.1、配置

solon.app:
  group: "demo" #同时也会做为服务分组(如果适配的服务支持的话)
  name: "demoapp"  #同时也做为服务注册名

solon.cloud.water:
  server: "waterapi:9371"

增强应用元信息(可用于过滤,通过 meta 和 tags):

solon.app:
  name: "demoapp"
  group: "demo"
  meta:                   #添加应用元信息(可选)
    version: "v1.0.2" 
    author: "noear"
  tags: "aaa,bbb,ccc"     #添加应用标签(可选)
  
solon.cloud.water:
  server: "waterapi:9371"

增加本地发现配置(按需选择):

solon.cloud.local:
  discovery:
    service:
      demoapp: #添加本地服务发现(demoapp 为服务名)
        - "http://localhost:8081"

2.2、Rpc 注册与发现应用

Rpc 服务端(服务注册是自动的,用户无感知)

//
// 1.所有 remoting = true 的组件,即为 rpc 服务;
// 2.以 uri 的形式提供资源描述,以同时支持 rest api 和 rpc 两种模式(不要有相同的函数名出现)
//
@Mapping("/rpc/")
@Remoting
public class HelloServiceImpl implements HelloService{

    @Override
    public String hello(String name) {
        return null;
    }
}

Rpc 客户端

@Controller
public class HelloController {
    //注入Rpc服务代理(会自动通过发现服务获取服务集群)
    @NamiClient(name = "hellorpc", path = "/rpc/")
    HelloService helloService;
    
    public String hello(String name){
        return helloService.hello(name);
    }
}

2.3、基于发现服务的负载均衡

发现服务的适配成果,最终会转为负载均衡接口:

//根据服务名获取“负载均衡”
LoadBalance loadBalance = LoadBalance.get("hellorpc");

“@NamiClient(name = "hellorpc")” 便于基于 LoadBalance。再比如,支持服务名调用的 http client(solon.cloud.httputils)

String rst = HttpUtils.http("hellorpc", "/rpc/hello").data("name","world").post();

代码演示:

https://gitee.com/noear/solon-examples/tree/main/9.Solon-Cloud