服务发现是基于微服务架构的关键原则之一。尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱。Netflix服务发现服务器和客户端是Eureka。可以将服务器配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。
一、 Eureka服务端
Eureka服务器没有后端存储,但是注册表中的服务实例都必须发送心跳线以保持其注册更新(因此可以在内存中完成)。客户端还具有eureka注册的内存缓存(因此,他们不必为注册表提供每个服务请求)。
默认情况下,每个Eureka服务器也是Eureka客户端,并且需要(至少一个)服务URL来定位对等体。
主要步骤:
1、配置文件application.yml:
###服务端口号
server:
port: 8100
###eureka 基本信息配置
eureka:
instance:
###注册到eurekaip地址
hostname: 127.0.0.1
# 可选 ###应用程序向eureka注册时,服务名使用其IP地址而不是其主机名
prefer-ip-address: true
client:
#表示是否将自己注册到Eureka Server,默认为true
register-with-eureka: false
#表示是否从Eureka Server获取注册信息,默认为true
fetch-registry: false
#指向与本地实例相同的主机 设置与Eureka Server交互的地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2、启动类EurekaApp:
@SpringBootApplication
@EnableEurekaServer
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class,args);
}
}
3、pom文件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--SpringCloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- 指定从spring仓库获取-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
4、启动服务,看到此页面即是服务端搭建成功。
二、客户端
1、application.yml
###服务启动端口号
server:
port: 8101
###服务名称(服务注册到eureka名称)
spring:
application:
name: app-user
###服务注册到eureka地址
eureka:
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true
client:
service-url:
defaultZone: http://localhost:8100/eureka
2、pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
3、启动类UserApp
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
public class UserApp {
public static void main(String[] args) {
new SpringApplicationBuilder(UserApp.class).web(true).run(args);
}
}
具体生产实际使用时,我们可能为了提高安全性,采用密码验证
(1)Eureka服务器进行身份验证
可以直接在URL中嵌入了凭证:如
client: service-url: defaultZone: http://user:password@localhost:8101/eureka
对于更复杂的需求,可以创建DiscoveryClientOptionalArgs
类型的@Bean
并将ClientFilter
实例注入到其中
(2)Eureka的健康检查
默认情况下,Eureka使用客户端心跳来确定客户端是否启动。除非另有规定,否则发现客户端将不会根据Spring Boot Actuator传播应用程序的当前运行状况检查状态。这意味着成功注册后,Eureka将永远宣布申请处于“UP”状态。可以通过启用Eureka运行状况检查来改变此行为,从而将应用程序状态传播到Eureka。因此,每个其他应用程序将不会在“UP”之外的状态下将流量发送到应用程序。