<a href="/article/family-solon-cloud-discovery">生态 / Solon Cloud Discovery [传送]</a>

### 1、情况简介

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

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

目前适配有：local（本地模拟实现）, water, consul, nacos, zookeeper, polaris 等

### 2、简单演示

#### 2.1、配置

```yaml
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"
````

增加（或者使用）本地发现配置（按需选择）：

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

#### 2.2、Rpc 注册与发现应用

Rpc 服务端（服务注册是自动的，用户无感知）

```java
//
// 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 客户端（使用 name 与 path 替代 url 配置）

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


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

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

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

`@NamiClient(name = "hellorpc")` 便于基于 LoadBalance。 再比如，支持服务名调用的 http client（solon-net-httputils）

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



### 3、定制服务发现

基于 “Solon Cloud Discovery” 接口实现（可以对接数据库等...）

```java
//找一个 Solon Cloud Discovery 适配插件参考下
public class CloudDiscoveryServiceImpl implements CloudDiscoveryService{
    ...//接口，可以按需实现
}


CloudManager.register(new CloudDiscoveryServiceImpl());
```





**代码演示：**

[https://gitee.com/noear/solon-examples/tree/main/9.Solon-Cloud](https://gitee.com/noear/solon-examples/tree/main/9.Solon-Cloud)