美文网首页
ServiceComb 笔记(二):微服务调用

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

作者: redexpress | 来源:发表于2020-10-30 04:36 被阅读0次

    上一篇笔记创建了名称为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依赖:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    

    添加代码

    创建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 笔记(二):微服务调用

          本文链接:https://www.haomeiwen.com/subject/mvelvktx.html