一、什么是Eureka
Eureka 是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring cloud将它集成在子项目Spring cloud Netflix中,从而实现微服务的注册与发现。
二、Eureka原理
注:上图来源于网络,非lz所画
如图,可以看出服务的生产端将服务注册到Eureka中,当客户端需要消费的时候,只需要去Eureka取出服务端的数据即可。由此可见Eureka就是一个保存服务的部署信息的仓库。他负责服务的注册和发现。
二、编写Eureka服务
Eureka服务先引入jar包依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
然后编写启动类,并在启动类上引入注解@EnableEurekaServer
package com.wangcongming.shop.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author wangcongming
* @Package com.wangcongming.shop.eureka
* @Description:
* @date 2018/5/8 20:17
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
配置文件编写
server.port=8802
#注册中心默认端口就是8802,也可通过下面的方式定义其他端口
spring.application.name=eureka-server
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.registerWithEureka表示是否将自己本身注册到Eureka中,false表示不注册
eureka.client.fetchRegistry表示是否从Eureka中获取注册信息,false表示不获取
现在一个简单的Eureka服务注册中心就搭建完成了
三、Eureka的高可用
系统的搭建,它的可用性很重要,现在我们把服务注册到Eureka中,但是如果Eureka服务宕机了怎么办呢?
下面就说说Eureka服务的高可用。
Eureka是个服务注册与发现中心,我们只需要将Eureka服务本身注册到Eureka中,然后多部署几个节点,搭建出Eure server集群,那么就可以达到Eureka的高可用了,具体实现如下。
1.修改启动类,加入@EnableEurekaClient注解,代码如下
package com.wangcongming.shop.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author wangcongming
* @Package com.wangcongming.shop.eureka
* @Description:
* @date 2018/5/8 20:17
*/
@SpringBootApplication
@EnableEurekaServer
@EnableEurekaClient
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
2.修改配置文件
server.port=8802
#注册中心默认端口就是8802,也可通过下面的方式定义其他端口
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:8802/eureka/,http://localhost:8803/eureka/
#eureka.client.registerWithEureka=false
#eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone 表示的是注册地址
四、Eureka client端编写
Eureka服务已经搭建完毕,下面开始介绍怎么使用
1.搭建新的服务,引入jar包
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2.编写配置文件
# Set Listen Port
spring.application.name=user-system
server.port=8801
#Runtime Environment: dev test prod
spring.profiles.active=dev
eureka.client.serviceUrl.defaultZone=http://localhost:8802/eureka/,http://localhost:8803/eureka/
3.编写启动类
package com.wangcongming.shop.user;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.ComponentScan;
/**
* @author wangcongming
* @Package com.wangcongming.shop.user
* @Description:
* @date 2018/5/8 19:58
*/
@EnableEurekaClient
@SpringBootApplication
public class UserSystemApplication {
public static void main(String[] args) {
SpringApplication.run(UserSystemApplication.class,args);
}
}
Eureka服务注册中心到这里就介绍完了
最后再说一点,Eureka服务注册情况,可打开链接 http://localhost:8802/查看
五、为Eureka server添加用户认证
在项目架构中安全很重要,像这样不加认证,就可以将服务注册进Eureka是非常不安全的。
下面介绍如何添加用户认证
1.在刚刚的Eureka server中添加jar依赖,依赖如下
<!--为Eureka添加用户认证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.在配置文件中,添加配置信息
security.basic.enabled=true
security.user.name=wangcongming
security.user.password=123456
3.改造Eureka client注册url
eureka.client.serviceUrl.defaultZone=http://username:password@localhost:8802/eureka/
六、Eureka的自我保护
eureka server 在一定时间内没有接收到某个服务实例的心跳,Eureka server 则自动会将该实例注销(默认心跳时间是90s)。但是当因为故障等一些原因,导致微服务与Eureka server之间不能正常通信,此时微服务本身是没有问题的,如果这时注销微服务实例是不合适的。
Eureka通过自我保护机制来解决这个问题,当Eureka server的节点在短时间内丢失过多客户端时,那么这个节点会进入自我保护模式。进入此模式,不会再删除服务注册表中的数据,此时会将数据保护起来,等到故障恢复后,会自动退出自我保护模式。
在spring cloud中可以配置eureka.server.enable-self-preservation=false来禁用自我保护模式,默认是启用的
七、Eureka的健康检查
在Status栏显示着UP,表示应用程序状态正常。其它取值DOWN、OUT_OF_SERVICE、UNKNOWN等,只有UP的微服务会被请求。由于Eureka Server与Eureka Client之间使用心跳机制来确定Eureka Client的状态,默认情况下,服务器端与客户端的心跳保持正常,应用程序就会始终保持“UP”状态,所以微服务的UP并不能完全反应应用程序的状态。Spring Boot Actuator提供了/health端点,该端点可展示应用程序的健康信息,只有将该端点中的健康状态传播到Eureka Server就可以了,实现这点很简单,只需为微服务配置如下内容:
#开启健康检查(需要spring-boot-starter-actuator依赖)
eureka.client.healthcheck.enabled = true