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依赖:
<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();
}
添加实现:
这里介绍微服务调用的两种方式:
- 使用
RestTemplate
- 使用远程接口
@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"}