前言
在Eureka的服务治理体系中,主要分为服务端和客户端
- 服务端:注册中心
- 构建高可用的注册中心集群后,每个注册中心也是体系中的客户端,只是注册中心除了作为客户端之外,还为其他客户端提供了服务注册的特殊功能)
- 客户端:提供接口的微服务应用
Spring Cloud Eureka基于NetFlix Eureka做了二次封装,为Eureka增加了Spring Boot风格的自动化配置。Spring Boot构建的微服务应用只需两步就可以与Eureka服务治理体系整合
- 引入依赖
- 注解配置
构建注册中心
- 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><!-- 服务端依赖 -->
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version><!-- spring cloud 版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 注解配置
spring:
application:
name: eureka-server
server:
port: 1111
eureka:
instance:
hostname: localhost
server:
enable-self-preservation: false #开发环境关闭eureka的自我保护机制,确保注册中心将不可用的实例正确剔除
client:
register-with-eureka: false # 单节点下注册中心不需要注册、发现服务
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
以上两步搭建了一个简单的注册中心
Eureka服务端更多地类似一个现成产品,大多数情况下不需要修改它的配置信息
只是开发环境中关闭注册中心的“自我保护功能”,确保注册中心将不可用的实例正确剔除
EurekaServiceConfigBean里有eureka.service的所有属性
搭建服务提供者
- 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><!-- spring cloud 客户端依赖 -->
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version><!-- spring cloud 版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 配置注解
spring:
application:
name: hello-service # 服务名
server:
port: 8080
eureka:
instance:
hostname: localhost # 实例主机名,如果不配置,服务名转host:port格式时host为系统生成的ASUS_PC,无法访问
client:
service-url:
defaultZone: http://localhost:1111/eureka/ #,http://localhost:1112/eureka/ # 将服务注册到两个注册中心时用逗号隔开
启动程序控制台打印以下语句,说明注册成功
DiscoveryClient_HELLO-SERVICE/ASUS_PC:hello-service:8080 - registration status: 204
- 提供服务
@RestController
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "hello,consumer;";
}
}
搭建服务消费者
- 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><!-- spring cloud 客户端依赖 -->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId><!-- 客户端负载均衡 -->
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version><!-- spring cloud 版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 配置注解
spring:
application:
name: ribbon-consumer
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:1111/eureka/ # 将消费者注册到注册中心,这样消费者才能从注册中心获取到服务清单
- 调用服务
@SpringBootApplication
public class RibbonConsumerApplication {
@Bean
@LoadBalanced // 标记通过该对象访问服务会执行客户端负载均衡
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
}
@RestController()
public class HelloController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return restTemplate.getForObject("http://HELLO-SERVICE/hello", String.class);// 此处写服务名,ribbon会将服务名转为具体的host:port格式
}
}
启动服务,访问http://localhost:8082/hello 返回“hello,consumer”
【注】
- 大多数情况下,一个Spring Boot应用既是服务提供者,也是服务消费者EurekaClientConfigBean
- Eureka客户端配置主要分为以下两方面
- 服务注册相关,包括注册中心地址、服务获取的间隔时间、可用区域等。EurekaClientConfigBean查看所有属性
- 服务示例相关,包括服务实例的名称、主机名、端口号、健康检查路径等。EurekaInstanceConfigBean查看所有属性