目录
一、Eureka简介
Eureka源于Netflix,是一套基于REST(Representational State Transfer)的服务发现框架。Spring Cloud将它集成在其子项目spring-cloud-netflix中。
Eureka架构如下图
Eureka包含Eureka Server和Eureka Client两个组件
- Eureka Server
Eureka Server是注册中心,通过Register、Get、Renew等接口提供服务的注册、发现和心跳检测等服务。多个Eureka Server 可以组成集群,以达到高可用的目的。各个server启动后会自动同步注册表信息。
- Eureka Client
Eureka Client是一个java客户端。Eureka Client注册到Eureka Server后会定期(默认30秒)发送心跳,如果server端在多个心跳周期内未收到某client的心跳,就会将该client从服务注册表中删除。
在上面的架构图中,Eureka Client有Application Service和Application Client两个角色,即Eureka Client可做为服务提供者或服务调用者。
- Eureka架构图中的动作说明
Register(服务注册):把自己的IP和端口注册给Eureka。
Renew(服务续约):发送心跳包,默认每30秒发送一次。告诉Eureka自己还活着。
Cancel(服务下线):当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务。
Get Registry(获取服务注册列表):获取其他服务列表。
Replicate(集群中数据同步):eureka集群中的数据复制与同步。
Make Remote Call(远程调用):完成服务的远程调用。
二、搭建单机版Eureka Server
- 新建spring boot项目,pom中加入spring-cloud-starter-netflix-eureka-server依赖,如下
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springcloud.stu</groupId> <artifactId>eureka-single-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-single-server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <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> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 在Spring boot的启动类增加@EnableEurekaServer注解, 以开启注册服务功能。
@SpringBootApplication @EnableEurekaServer public class EurekaSingleServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaSingleServerApplication.class, args); } }
- 编写application.yml配置文件
server: port: 7631 spring: application: name: eureka-single-server eureka: instance: hostname: localhost instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} server: #是否开启自我保护模式,默认情况下,注册中心每分钟去清理未续约的客户端,但开启自我保护模式时,如果有超过85%的客户端未续约, #则进入自我保护模式,不再清理未续约的客户端 enable-self-preservation: true client: #是否将自己注册到注册中心,默认true register-with-eureka: true #是否从注册中心获取注册表信息,自己本身就是注册中心,所以不需要 fetch-registry: false #注册中心地址,多个用逗号分隔 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 启动Spring boot的启动类,在浏览器输入http://localhost:7631/,打开Eureka的服务面板,单机版的Eureka Server即搭建成功。
- f
三、创建Eureka Client
这里会创建两个Client, 一个作为服务提供者,另一个作为服务消费者。
- 创建一个Eureka Client,作为服务提供者,步骤如下 1.1 新建一个Spring Cloud项目, pom中加入如下依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency>
2.2 修改Spring Boot启动类,增加EnableEurekaClient(推荐使用EnableDiscoveryClient,是更高层次的抽象,不限定是Eureka的客户端)注解。
@SpringBootApplication @EnableEurekaClient public class EurekaClientProducerApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientProducerApplication.class, args); } }
2.3 修改application.yml
server: port: 8631 spring: application: name: eureka-client-producer eureka: instance: hostname: localhost appname: producer #显示在Eureka控制面板中,如果不配置,将会显示 spring.application.name的值 client: service-url: #注册中心地址 defaultZone: http://localhost:7631/eureka/
2.4 创建一个Web Controller,提供接口服务
@RestController @RequestMapping(path="producer") public class ProducerController { @GetMapping("/get") public String get(String name) { return return "Hello "+name;; } }
2.5 启动项目,查看是否成功注册到Eureka Server
- 创建第二个Eureka Client,作为服务消费者,步骤同创建第一个Eureka Client。其application.yml如下
server: port: 8632 spring: application: name: eureka-client-consumer eureka: instance: hostname: localhost appname: consumer #显示在Eureka控制面板中,如果不配置,将会显示 spring.application.name的值 client: service-url: #注册中心地址 defaultZone: http://localhost:7631/eureka/
Spring Boot启动类中增加RestTemplate Bean, 用来调用Producer的接口
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
Controller中使用RestTemplate调用Producer服务, 调用地址使用producer的spring.application.name的值
@RestController @RequestMapping("/consumer") public class ConsumerController { @Autowired RestTemplate restTemplate; @GetMapping("/get") public String get(String name) { return "producer return:"+restTemplate.getForObject("http://eureka-client-producer/producer/get?name="+name, String.class); } }
启动项目,注册成功后访问 http://localhost:8632/consumer/get?name=Tom , 返回“producer return:Hello Tom”。至此Eureka Client演示完毕。
四、Eureka 安全
在Eureka Server的pom中加入spring-boot-starter-security依赖,启动服务后访问Eureka的仪表盘会发现提示输入帐号密码。默认帐号为user, 密码在服务启动时会随机生成。 可以修改application.yml来设置用户名和密码
这时,Eureka Client都无法注册到Eureka Server, 所以还需要做如下配置
首先,增加security 配置
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* @Description: 高版本的丢弃了
* security:
* basic:
* enabled: true 配置,应该使用以下方式开启
* @Param: [http]
* @Return: void
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
// Configure HttpSecurity as needed (e.g. enable http basic).
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
http.csrf().disable();
//注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
// 如果是form方式,不能使用url格式登录
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
其次,eureka.client.service-url.defaultZone 的配置中增加用户名和密码信息,格式如下
五、Eureka Server 集群
如果要达到高可用的目的,建议搭建不少于3个Eureka Server节点。
- 为了模拟集群,首先修改系统的hosts文件
127.0.0.1 peer1 127.0.0.1 peer2 127.0.0.1 peer3
-
修改Eureka Server 的application.yml文件,配置三个profiles: peer1, peer2, peer3
eureka: instance: appname: eureka-server-ha prefer-ip-address: false instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} spring: application: name: eureka-server-ha # profiles: # active: # - peer3 #启动命令 nohup java -jar xxx.jar --spring.profiles.active=peer1 --- server: port: 8761 spring: profiles: - peer1 eureka: instance: hostname: peer1 client: service-url: defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/ --- server: port: 8762 spring: profiles: - peer2 eureka: instance: hostname: peer2 client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/ --- server: port: 8763 spring: profiles: - peer3 eureka: instance: hostname: peer3 client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
-
使用maven install 生成jar包
-
在windows命令行窗口分别执行 java -jar xxxx.jar --spring.profiles.active=peer1,来启动peer1。同样的方式启动peer2和peer3。访问 http://peer1:8761, http://peer2:8762 和 http://peer3:8763
-
Eureka Client 注册到集群的方式,只需将三个节点的地址都写到service-url。
client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/