ServiceComb 笔记(二):微服务调用

在上一篇笔记创建了名称为helloworld的服务。
现在创建名为math的为服务。

准备工作

从上一篇笔记复制 application.properties 文件,修改端口号和service_description.name配置,完整的文件如下:

server.port=8081
APPLICATION_ID=hello
service_description.name=math
service_description.version=0.1
servicecomb.service.registry.address=http://127.0.0.1:30100
servicecomb.rest.address=0.0.0.0:${server.port}

service_description.environment=development

复制之前的Hello接口文件:

package io.github.redexpress.hello;

public interface Hello {
    String hello();
}

注意:保持本文件与上文一摸一样,包括package声明。

这个接口代码是重复的,重构时可以考虑把接口放在一个单独的项目中。

从上一篇笔记复制pom.xml的依赖项,并添加Lombok依赖:


    org.projectlombok
    lombok
    provided

添加代码

创建SimpleEndpoint.java

@RestSchema(schemaId = "math")
@RequestMapping(path = "/")
public class SimpleEndpoint {
    SimpleService simpleService;

    @Autowired
    public SimpleEndpoint(SimpleService simpleService) {
        this.simpleService = simpleService;
    }

    @GetMapping(path = "/sayhello/{name}")
    public HelloVO sayHello (@PathVariable(value = "name") String name) {
        return simpleService.sayHello(name);
    }
}

创建Java值对象类HelloVO.java

@Data
@Builder
public class HelloVO {
    String message;
    String name;
    String instanceId;
}

创建服务接口SimpleService.java

public interface SimpleService {
    HelloVO sayHello(String name);
    String instanceId();
}

添加实现:
这里介绍微服务调用的两种方式:

  1. 使用RestTemplate
  2. 使用远程接口@RpcReference

使用RestTemplate

使用RestTemplate调用微服务的URL格式为:
cse://微服务名称/微服务路径
调用helloworld微服务的URL是"cse://helloworld/hello"
完整代码

private static RestTemplate restTemplate = RestTemplateBuilder.create();
public HelloVO sayHello(String name) {
    String message = restTemplate.getForObject("cse://helloworld/hello", String.class);
    return HelloVO.builder().message(message).name(name).instanceId(instanceId()).build();
}

使用远程接口

声明远程接口:

@RpcReference(microserviceName = "helloworld", schemaId = "hello")
private static Hello hello;

调用就很简单了,和普通的Java方法调用类似,代码如下:

private static Hello hello;

public HelloVO sayHello(String name) {
    String message = hello.hello();
    return HelloVO.builder().message(message).name(name).instanceId(instanceId()).build();
}

注意:1. 使用RestTemplate和远程接口调用,要求互相调用的微服务的APPLICATION_ID是相同的。2. service_description.environment的值也要相同。

当上面提到的微服务调用方式条件不满足时怎么调用呢?直接用HTTP访问就行了哦。

项目代码还有一段显示instanceId的代码,本文就不列出了。
完整代码在:https://github.com/redexpress/servicecomb-tutorial/tree/main/simpleweb

测试

启动注册中心,启动helloworld服务、math服务
使用curl localhost:8081/sayhello/bill命令,返回类似:

{"message":"Hello World!","name":"bill","instanceId":"3c79097219dc11eb8d42acbc32a4ce49"}

你可能感兴趣的:(ServiceComb 笔记(二):微服务调用)