一.简介
RestTemplate 访问服务端时需要明确服务端地址,在服务端宕机、地址变化后则需要大量修改。微服务中使用注册中心对所有微服务管理,微服务启动后把自己注册到注册中心,注册中心以统一的方式暴露服务。
注册中心功能:
1.服务注册表:记录注册的微服务ip地址、端口、微服务名称等信息
2.服务检查:注册中心与微服务使用一定机制检查已注册的服务(微服务向注册中心发送心跳信息续约),如发现服务长时间无法访问,就会把微服务从注册表中移除
二.定义Eureka服务端
1.定义父工程
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.vincent</groupId>
<artifactId>spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>service-eureka</module>
</modules>
<name>spring-cloud</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.建立子模块service-eureka 注册中心
<?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">
<parent>
<artifactId>spring-cloud</artifactId>
<groupId>com.vincent</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-eureka</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.vincent.eureka.EureakApp</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
spring-cloud-starter-netflix-eureka-server已经依赖了spring-boot-starter-web,故不需要在pom.xml中再引入。
3.编写application.yml 配置文件
server:
port: 8010
spring:
application:
# 服务名称,注册中心显示的服务标志,相同名称的为同一个服务
name: service-eureka
eureka:
client:
#eureka服务端本身也是一个微服务,设置该微服务不向eureka注册中心注册服务
register-with-eureka: false
#设置当前的服务不需要从eureka注册中心获取服务注册信息
fetch-registry: false
#注册中心服务地址(不能乱写),其注册中心服务地址为:schema://host-name:port/context-path/eureka,eureka是固定的注册中心访问映射
service-url:
defaultZone: http://localhost:8010/eureka
server:
eviction-interval-timer-in-ms: 60000 #设置对无用微服务清理时间间隔,默认是60s清理一次
当运行清理工作时将有如下输出:
2020-09-05 18:58:22.433 INFO 13108 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
4.编写程序启动类并运行
package com.vincent.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EureakApp {
public static void main(String[] args) {
SpringApplication.run(EureakApp.class,args);
}
}
5.访问http://localhost:8010/
三.注册微服务
1.建立service-user子模块微服务
<?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">
<parent>
<artifactId>spring-cloud</artifactId>
<groupId>com.vincent</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-user</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.vincent.user.UserApp</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
spring-cloud-starter-netflix-eureka-client 也引入了spring-boot-starter-web依赖。
2.修改application.yml 配置Eureka客户端
server:
port: 8020
spring:
application:
name: service-user #定义微服务名称
eureka:
client:
service-url:
#注册中心地址,Eureka采用HA机制则使用","分割多个注册中心
defaultZone: http://localhost:8010/eureka
instance:
#注册到注册中心的服务依靠心跳机制与Eureka保持联系,默认的心跳时间30s
lease-renewal-interval-in-seconds: 30
3.编写启动类
package com.vincent.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class UserApp {
public static void main(String[] args) {
SpringApplication.run(UserApp.class,args);
}
}
4.http://localhost:8010/
将能看到注册到注册中心的服务SERVICE-USER。
四.Eureka Server安全认证
为增加Eureka Server 的安全性,实际项目中都会需要认证才允许访问Eureka Server。
1.Eureka Server 开启HTTP Basic认证,引入spring-boot-starter-security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.application.yml 添加用户名密码
security:
user:
name: admin
password: admin
basic:
enabled: true
这样将为Eureka Server添加HTTP Basic安全认证,注册路径将是:
http://username:password@Eureak_Host:port/eureka,即http://admin:admin@localhost:8010/eureka
3.访问http://localhost:8010/ 需要身份验证
五.Eureak HA 机制
Eureka Client会定时连接Eureka Server更新本地缓存的服务数据,因此一般来说,即使Eureka Server 宕机也不会影响服务之间的调用,但是在服务也宕机后,Eureka Client中的缓存得不到更新将会影响服务调用。
集群模式需要运行多个Eureka Server实例并相互注册的方式实现高可用。
1.修改application.yml 配置文件
server:
port: 8010
spring:
application:
# 服务名称,注册中心显示的服务标志,相同名称的为同一个服务
name: service-eureka
eureka:
client:
service-url:
defaultZone: http://localhost:8010/eureka,http://localhost:8011/eureka
2.分别在8010、8011端口启动Eureka Server
java -jar target/service-eureka-0.0.1-SNAPSHOT.jar
java -jar target/service-eureka-0.0.1-SNAPSHOT.jar --server.port=8011
3.访问http://localhost:8010/
可以看到service-eureka 的Availability Zones为2
4.应用注册到Eureka Server集群上只需要修改Eureka Client的eureka.client.service-url.defaultZone 为Eureka Server的各节点,也可以只填写单个节点,因为多个Eureka Server 之间的数据会相互同步,但是为了适应极端场景还是需要配置多个Eureka Server节点