Spring Cloud Eureka是Spring Cloud Netflix中的一部分,基于Netflix Eureka做了二次封装,主要负责微服务架构中的服务治理。
服务治理主要是用来实现各个微服务实例的自动化注册与发现。
主要功能:
服务注册
每个服务单元向服务中心等级自己提供的服务,将主机号、端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。
服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,达到排除故障服务的效果。
服务发现
服务向服务注册中心发起调用,便从服务清单中以某种轮询策略取出一个位置来进行服务调用。
Netflix Eureka包含了服务端和客户端组件,均由java实现,主要适用于Java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka服务端的服务治理机制提供了完备的Restful Api,所以也支持非JVM语言构建的微服务,只是其他语言需要自己实现Eureka服务端程序。
Eureka服务端:服务注册中心。
Eureka客户端:主要处理服务注册与发现。
接下来是服务端的代码部分。
基于SpringBoot项目的基础上,pom文件增加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
下面是启动类,可以看出启动类和普通的springboot启动类差别不大,只是增加了@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
下面是服务端的application.properties
server.port=1111
spring.application.name = eureka-server
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/
配置完可以直接登录localhost:1111
可以看到暂时还没有注册任何服务。没有关系,接下来我们搭建客户端。
以下是Eureka客户端代码,因为为我们要测试,需要restful api,所以除了Eureka的客户端以外,还要引入SpringMVC
基于SpringBoot项目的基础上,pom文件增加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
下面是启动类,可以看出启动类和普通的springboot启动类差别不大,只是增加了@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
下面是客户端的application.properties
server.port=8080
spring.application.name = eureka-client
#eureka.instance.hostname=eureka-client
#下面是之前注册的Eureka服务端地址
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
然后我们再新增一个HelloController,用于测试。
@RestController
public class HelloController {
private final Logger logger = Logger.getLogger("HelloController");
@Autowired
private DiscoveryClient client;
@Autowired
private Registration registration;
@RequestMapping("/hello")
public String index() {
ServiceInstance instance = client.getInstances(registration.getServiceId()).get(0);
logger.info("/hello,host: " + instance.getHost() + " , service_id: " + instance.getServiceId());
return "Hello World!";
}
}
我们可以刷新一下http://localhost:1111/
这时候我们的服务就已经注册上去了,尝试访问一下HelloController,打印出如下日志。
2020-04-12 14:23:59.209 INFO 20100 --- [nio-8080-exec-7] HelloController: /hello,host: eureka-client , service_id: EUREKA-CLIENT