nsul, 都要提供 Controller 方法
<?xml version="1.0" encoding="UTF-8"?>
...
<name>Dummy: Admin API</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.rockbb.test</groupId>
<artifactId>dummy-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<finalName>dummy-admin</finalName>
<resources>
...
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
在主应用入口, 除了 @SpringBootApplication 以外, 还需要增加两个注解
- @EnableDiscoveryClient(autoRegister=false) 连接到 Consul 并使用服务发现, 默认会将当前节点也注册到 Consul 作为服务. 对于纯消费节点, 不对其它节点提供接口的, 使用 autoRegister=false 可以避免将自己注册到 Consul
- @EnableFeignClients(basePackages = {"com.rockbb.test.dummy.common.api"}) 扫描对应的包, 对 @FeignClient 注解实例化接口代理
/* Attach to discovery service without registering itself */
@EnableDiscoveryClient(autoRegister=false)
@EnableFeignClients(basePackages = {"com.rockbb.test.dummy.common.api"})
@SpringBootApplication
public class AdminApp {
public static void main(String[] args) {
SpringApplication.run(AdminApp.class, args);
}
}
在调用方法的地方, 按普通 Service 注入和调用
@Slf4j
@RestController
public class IndexController {
@Autowired
private UserDTOService userDTOService;
@GetMapping(value = "/user_get")
public String doGetUser() {
UserDTO user = userDTOService.get(100L);
return user.getId() + ":" + user.getName();
}
@GetMapping(value = "/user_add")
public String doAddUser() {
UserDTO user = new UserDTO();
user.setName("foobar");
int result = userDTOService.add(user);
return String.valueOf(result);
}
可以通过注入的 DiscoveryClient 对象, 查看对应服务的服务地址(一般不需要)
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/services")
public Optional<URI> serviceURL() {
return discoveryClient.getInstances(CommonConstant.SERVICE_NAME)
.stream()
.map(ServiceInstance::getUri)
.findFirst();
}
项目代码
项目的完整代码已经上传至 GitHub, 仓库地址: https://github.com/MiltonLai/spring-cloud-demos
与文中的模块相比, 增加了两个模块 dummy-file-api 和 dummy-file-impl 用于演示多级调用.
参考