Spring Cloud Eureka 服务注册与调用
1. SpringCloud Eureka 介绍
SpringCloud Eureka 使用 Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件,均用Java语言编写。比较适用于通过Java实现的分布式系统。
Eureka 服务端的服务治理机制提供了完备的 RESTful API,所以也支持其他语言构建的微服务纳入Eureka的服务治理体系中,不过需要自己实现客户端程序。
1.1 Eureka 服务端
Eureka服务端也称为注册中心,支持高可用配置。依托于强一致性,提供良好的服务实例可用性,可以应对多种不同的故障场景。
1.2 Eureka 客户端
Eureka客户端主要处理服务的注册与发现,通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。
2. SpringCloud Eureka 搭建测试
2.1 搭建服务注册中心(服务端)
- 创建一个moudle->Spring Initializr,选择依赖 Eureka Server
- 配置文件 application.properties (或者yml)
# 应用名称
spring.application.name=EUREKA-SERVER
# 端口号
server.port=8080
# 主机地址
eureka.instance.hostname=localhost
# 是否注册自己
eureka.client.register-with-eureka=false
# 检索服务
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone= http://${eureka.instance.hostname}:${server.port}/eureka
- 允许EurekaServer,添加 @EnableEurekaServer 注解
- 启动moule,进入 http://主机名:端口号查看
可以看到Eureka服务器已经搭建成功,但是此时还没有注册的服务实例
2.2 注册服务提供者1(客户端1)
- 新建一个moudle->Spring Initializr,选择依赖 Eureka Discovery Client
- 配置文件 application.properties (或者yml)
# 服务名称
spring.application.name=EUREKA-CLIENT1
# 服务运行端口号
server.port=8081
# 服务端注册中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
-
添加 @EnableDiscoveryClient 注解
-
查看注册中心(服务端)
- 编写一个Controller查看自身的信息
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class Client1Controller {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping(value = "/hello")
public String hello(){
List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-CLIENT1");
ServiceInstance serviceInstance = instances.get(0);
System.out.println((serviceInstance.getHost() + serviceInstance.getPort() + serviceInstance.getServiceId()));
return "Hello World";
}
}
键入 http://localhost:8081/hello
浏览器显示:
控制台输出:
可以看到,服务注册成功
3. 服务调用测试
3.1 注册另外的服务提供者2(客户端2)
基本的过程和pom文件与服务提供者1基本相同,注意 <host:port> 不能相同(如果是单机修改端口号即可,在我这里设置为8082)
3.2 调用其他的服务
我们在注册的服务2中调用已经注册的服务1。
在服务2中编写Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class Client2Controller {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
public RestTemplate restTemplate;
@GetMapping(value = "/testHello")
public String testHello(){
String string = restTemplate.getForObject("http://EUREKA-CLIENT1/hello", String.class);
return "The Result From Client Is : " + string;
}
}
访问: http://localhost:8082/testHello,如图所示:
调用成功~
4. 总结
4.1 综述
核心就是编写注册中心和各个服务
4.2 注册中心要点
- 引入Eureka Server 依赖
- 配置文件中配置各项(主机地址,端口号,注册中心地址,是否注册自己,检索服务。。。)
- 在Application类上加上 @EnableEurekaServer 注解
4.3 服务注册要点
- 引入 Eureka Discovery Client 依赖
- 配置文件(服务名称、主机号、端口号、注册中心地址)
- 在Application类上加上 @EnableDisconveryClient 注解
- 在Controller中编写RESTful服务项
4.4 服务调用要点
- 通过@Bean和@LoadBalance注解重新注入 RestTemplate
- 通过RestTemplate调用别的服务,获得结果
- 进行业务逻辑处理