7.Eureka学习
7.1 Eureka介绍
7.1.1认识Eureka
首先我们来解决第一问题,服务的管理。
问题分析 :
在刚才的案例中,provider对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来测试、发布上线都会非常麻烦。
生活中的一个例子:网约车
这就好比网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却没有资格,被称为黑车。而很多人想要约车,但是无奈出租车太少不方便。私家车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人的。一个想要,一个愿意给,就是缺少引子,缺乏管理。
此时滴滴这样的网约车平台出现了,所有想载客的私家车全部到滴滴注册,记录你的车型(服务类型),身份信息(联系方式)。这样提供服务的私家车在滴滴那里都能找到,一目了然。
此时要叫车的人,只需要打开APP,输入你的目的地,选择车型(服务类型),滴滴自动安排一个符合需求的车到你面前,为你服务。
Eureka做什么?
Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。
同时,服务提供方与Eureka之间通过“心跳”
机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。
这就实现了服务的自动注册、发现、状态监控。
7.1.2基本架构
Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发 送给消费者,并且定期更新。
心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
7.2 Eureka Server
7.2.1新建maven 工程eureka-server
pom.xml 中引入eureka-server依赖,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>edu.xja</groupId>
<artifactId>eureka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR7</spring-cloud.version>
</properties>
<dependencies>
<!--springcloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--springcloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--springboot的maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml 对注册中心进行配置
server:
port: 8761 # 指定该Eureka实例的端口
spring:
application:
name: euremka-server
# eureka server 配置
eureka:
client:
#是否将自己注册到注册中心
registerWithEureka: false
#是否从EurekaServer 获取注册信息
fetchRegistry: false
#设置与eureka交互的地址
serviceUrl:
defaultZone: http://localhost:8761/eureka/
edu.xja 包下编写启动类EurekaApplication
/**
* 使用Eureka做服务发现.
* @author Thomas
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
7.2.2 启动eureka server测试
访问http://localhost:8761/
7.3 Eureka Client
7.3.1修改模块microservice-provider-user
microservice-provider-user/pom.xml 文件中加入eureka-client 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
7.3.2配置注册中心信息
application.yml中添加
spring:
application:
name: user-provider
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
7.3.3启动microservice-provider-user
访问注册中心: http://localhost:8761/
7.4 Eureka Server的HA(高可用)
我们如果只配置一台注册中心(Eureka Server),就会出现SPOF(单点故障),如果Eureka Server发生宕机,就会影响注册到Eureka Server上的微服务,导致微服务不可用。
所以在生产环境中,通常会部署一个高可用的Eureka Server 集群。架构图如下:
7.4.1 编写高可用Eureka Server
Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server 实例会彼此增量的同步信息,从而确保所有节点数据一致。
事实上,节点之间的相互注册是Eureka Server的默认行为。
1.复制项目eureka-server 修改名字为eureka-server-ha
修改pom.xml 文件中的artifactId 为eureka-server-ha
- 配置系统的hosts
Ø Windows系统下的hosts文件路径是:C:\Windows\System32\drivers\etc\hosts
Ø Linux及Mac OS等系统的文件路径是:/etc/hosts
127.0.0.1 peer1 peer2
- 修改application.yml, 让两个节点互相注册
spring:
application:
name: microservice-eureka-server-ha
---
spring:
profiles: peer1
server:
port: 8761 # 指定该Eureka实例的端口
eureka:
instance:
#指定profile=peer1 时,主机名是peer1
hostname: peer1
client:
serviceUrl:
#将自己注册到peer2这个Eureka上面
defaultZone: http://peer2:8762/eureka/
---
spring:
profiles: peer2
server:
port: 8762 # 指定该Eureka实例的端口
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
代码说明:
使用连字符(—)将application.yml 分成三段,第二段和第三段分别为spring.profiles设置了一个值,该值表示它所在的那段内容应用在哪个profile里。
第一段由于并未指定spring.profiles,因此这段内容会对所有profile生效。
- 打包
mvn clean package -Dmaven.test.skip=true
-
启动测试
java -jar eureka-server-ha-1.0-SNAPSHOT.jar --spring.profiles.active=peer1 java -jar eureka-server-ha-1.0-SNAPSHOT.jar --spring.profiles.active=peer2
或者可用命令-D,不过要在jar包之前
java -jar -Dspring.profiles.active=peer1 eureka-server-ha-1.0-SNAPSHOT.jar java -jar -Dspring.profiles.active=peer2 eureka-server-ha-1.0-SNAPSHOT.jar
注意:启动第一台eureka-server时,console上会报错,因为它注册不到peer2
Peer2 还没有启动
浏览器分别访问8761端口和8762端口
7.4.2 将应用注册到Eureka Server 集群上
修改客户端microservice-provider-user,让客户端同时注册到多个注册中心。
client/application.yml
eureka:
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/ # 注意用逗号分开
# defaultZone: http://localhost:8761/eureka/
# instance:
# prefer-ip-address: true
启动客户端Erueka Client (microservice-provider-user)
7.5用户认证
上面的示例中,Eureka server 是允许匿名访问的,实际项目中,可能希望必须经过用户认证才允许访问。
7.5.1 为Eureka Server 添加用户认证
将eureka-server项目复制一份eureka-server-security
修改pom文件中artifactId
使用idea 打开工程eureka-server-security
eureka-server-security/pom.xml 加入安全依赖spring-boot-starter-security,该依赖为Eureka server提供用户认证的能力。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
修改工程eureka-server-security下的application.yml,添加以下内容
spring:
security:
user:
name: user
password: 123456
修改application.yml中eureka.client.serviceUrl. defaultZone 为http://user:123456@localhost:8761/eureka/
edu.xja.config包下添加web配置信息类
@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
/**
* 高版本springcloud的丢弃了配置:
*
* security:
* basic:
* enabled: true
*
* 所以应该使用以下方式开启
*
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
//注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
// 如果是form方式,不能使用url格式登录
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
启动测试
输入用户名和密码可以登录
7.5.2 将微服务注册到需认证的Eureka Server
修改microservice-provider-user下的application.yml
eureka:
client:
service-url:
defaultZone: http://user:123456@localhost:8761/eureka/
启动访问测试
启动测试
7.5.2 将微服务注册到需认证的Eureka Server
修改microservice-provider-user下的application.yml
eureka:
client:
service-url:
defaultZone: http://user:123456@localhost:8761/eureka/
启动访问测试