Eureka组件
- server 提供服务发现的能力它会储存各个微服务启动时向自己注册的信息(ip,port,微服务名称)。如果在一定时间内没有收到某个微服务的心跳,则会注销该服务(默认90s),如果由于网络原因大部分服务同时宕掉,server则会启动自我保护机制,不注销,从而保证高可用是一种应对网络异常的保护措施。默认情况下server也是client,多个实例之间互相复制注册,保证每个server的数据同步
- client 是一个java客户端,服务启动后会周期性向server发送心跳(默认30s)
-
架构图image.png
编写server
- 默认使用spring boot2.1 spring cloud Finchley.RC1 版本 导入maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- @EnableEurekaServer 声明这是个Eureka Server
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
- application.yml 配置文件
server:
port: 8000
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 打开浏览器输入http://localhost:8000/ 查看 系统状态,注册的实例
编写client服务把微服务注册到 server
- 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- @EnableDiscoveryClient 支持更多的服务组件 如zookeeper 等 也可以换成@EnableEurkaClient
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudClientApplication.class, args);
}
@RequestMapping("/hello")
public String hello(){
return "hello client";
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam String name) {
return "hi "+name+",i am from port:" +port;
}
}
- 配置文件
#自己的服务中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
server:
port: 9000
spring:
application:
name: service-hi
- 刷新server 的页面可以看到注册service-hi 服务名端口
Eureka 的集群
构建一个双节点 peer1,peer2 eureka server集群
server
- 复制第一个server 修改 ArtifactId 为eureka2 或者别的区分
- 配置系统的host windows 路径为c:\windows\system32\drivers\etc\host; linux MacOS 在 /etc/hosts
windows修改方法
127.0.0.1 peer1 peer2
- 修改两个server的配置文件,让两个节点的server 互相注册
spring:
application:
name: eureka-server2
# 三段式以上为集群的共有部分
---
#以下只要两两互相注册, 多个server就可以数据同步
spring:
#指定profiles 设置peer1为第一个节点
profiles: peer1
server:
port: 8001
eureka:
instance:
#指定profiles=peer1 时,主机名就为peer1了
hostname: peer1
client:
serviceUrl:
#把自己注册到 peer2 上
defaultZone: http://peer2:8002/eureka/
---
spring:
profiles: peer2
server:
port: 8002
eureka:
instance:
hostname: peer2
client:
serviceUrl:
#自己注册到peer1 上
defaultZone: http://peer1:8001/eureka/
-
启动配置如图,peer1,peer2修改启动参数对应就可以了image.png
-
输入peer1:8001image.png
当客户端注册时,serviceUrl可以指定其中一个所有集群节点就可以同步注册信息,也可以用逗号隔开 都写上
为 eureka server 添加用户认证
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
- application.yml
spring:
application:
name: eureka-server2
security:
user:
name: admin
password: admin
- 在认证的server注册client时这样serviceUrl.defaultZone=http://user:pwd@host:port/eureka
- 元数据又分为两种,标准和自定义;标准元数据指主机名,ip,端口,状态页,健康检查等信息,自定义元数据就需要eureka.instance.metadata-map配置,这些元数据可以在远程客户端访问,但一般不会改变客户端行为,除非它知道元数据含义。