本地注册发现是一种静态的服务发现机制。使用本地注册发现,需要在项目中引入如下依赖:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>registry-local</artifactId> </dependency>
本地服务发现可以在很多不同的场景使用,能够帮助开发者解决很多系统集成问题,比如和网关的集成,和第三方服务的集成。
和使用服务中心一样, 系统会自动完成注册。系统会从配置文件中读取本微服务的信息和实例信息,以及本微服务发布的 契约信息,将信息注册到内存中。
发现过程也是从本地进行查找。因此系统需要配置本地的微服务信息和实例信息,以及契约信息。 提供了下面两种方式:
使用配置文件的方式定义服务
这种方式从配置文件(registry.yaml)中读取服务的 Microservice
和 MicroserviceInstance
信息,从目录 microservices/{serviceName}/{schemaId}.yaml
或者 applications/{appId}/{serviceName}/{schemaId}.yaml
读取微服务的契约 信息。
registry.yaml 格式:
```yaml ms1: - id: "001" version: "1.0" appid: exampleApp environment: development schemaIds: - hello instances: - endpoints: - rest://127.0.0.1:8080 - id: "002" version: "2.0" environment: development appid: exampleApp schemaIds: - hello instances: - endpoints: - rest://127.0.0.2:8080 ms2: - id: "003" version: "1.0" environment: development appid: exampleApp schemaIds: - hello instances: - endpoints: - rest://127.0.0.1:8081 ```
registry.yaml
指定了微服务的基本信息:应用ID (appId), 微服务名称 (serviceName), 微服务版本(version),环境(environment) 和契约;微服务实例基本信息:网络地址(endpoints)。
使用 bean
的方式定义服务
```java @Bean public RegistryBean demoLocalRegistryServerBean2() { List<String> endpoints = new ArrayList<>(); endpoints.add("rest://localhost:8080"); List<Instance> instances = new ArrayList<>(); instances.add(new Instance().setEndpoints(endpoints)); return new RegistryBean() .setServiceName("demo-local-registry-server-bean2") .setId("003") .setVersion("0.0.3") .setAppId("demo-local-registry") .addSchemaInterface("CodeFirstEndpoint2", CodeFirstService.class) .setInstances(new Instances().setInstances(instances)); } ```
RegistryBean
的信息和 registry.yaml
的信息类似, 可以添加 Schema Interface
来添加 契约信息, 如果没有添加契约信息,这种方式也会从本地配置文件查找契约。 CodeFirstService 是一个接口, 和普通的 provider 接口定义类似:
@Path("/register/url/codeFirst") @Produces("application/json") public interface CodeFirstService { @GET @Path("getName") String getName(@QueryParam("name") String name); }
可以有非常多的方式调用第三方服务,比如采用第三方提供的 Rest Client。 但是需要提供一种 透明的方式,让调用第三方服务的客户端代码和调用 servicecomb 微服务的 客户端代码风格完全一样,并且拥有所有 servicecomb 的客户端治理能力。
在调用第三方服务里面介绍了servicecomb提供的一种 调用第三方服务的使用方式,这种方式依赖于使用服务中心作为注册发现。 可以看出使用本地服务发现能够非常方便的调用第三方服务。
只需要在原来的项目中引入本地注册发现,按照上述两种方式之一定义第三方服务的信息。 定义完成后,可以像访问 servicecomb 服务一样访问第三方服务,不用关心第三方服务是采用什么框架开发的。 下面代码片段来源于 demo, 演示了通过 java chassis 的方式调用服务中心接口。
public interface IServiceCenterEndpoint { // java name can not be `x-domain-name`, so interfaces define all parameters. @GetMapping(path = "/instances") Object getInstances(@RequestParam(name = "appId") String appId, @RequestParam(name = "serviceName") String serviceName, @RequestParam(name = "global") String global, @RequestParam(name = "version") String version, @RequestHeader(name = "x-domain-name") String domain); } @Component public class ServiceCenterTestCase implements CategorizedTestCase { @RpcReference(microserviceName = "thirdParty-service-center", schemaId = "ServiceCenterEndpoint") IServiceCenterEndpoint serviceCenterEndpoint; @Override public void testRestTransport() throws Exception { // invoke service-center(3rd-parties) @SuppressWarnings("unchecked") Map<String, List<?>> result = (Map<String, List<?>>) serviceCenterEndpoint.getInstances( "demo-multi-registries", "demo-multi-registries-server", "true", "0.0.2", "default"); TestMgr.check(result.get("instances").size(), 1); } }