本文主要搭建Spring Cloud Eureka服务注册中心(单节点),不过一般生产环境都是多节点负载均衡,形成一个服务注册中心集群,这样一个注册中心崩了不会影响整个系统的运行以及接口的调用。本文基于SpringBoot 1.5.2,Spring Cloud Camden.SR6版本编写,版本不一致可能会有差异。下面就学习总结记录一下:
首先引入依赖pom.xml:
4.0.0
com.springcloud.wsh
springcloud_eureka_server
0.0.1-SNAPSHOT
jar
springcloud_eureka_server
Spring Cloud Eureka服务提供者
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
UTF-8
1.8
Camden.SR6
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
@SpringBootApplication
//@EnableEurekaServer注解的作用: 开启Eureka服务发现的功能
@EnableEurekaServer
public class SpringcloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaServerApplication.class, args);
}
}
server:
port: 1111 #服务端口号
eureka:
client:
fetch-registry: false #是否检索服务
register-with-eureka: false #表示不向Eureka注册自身服务
service-url: #服务注册中心地址,其他服务可以通过指定eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/注册到Eureka上
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
instance:
#主机名
hostname: localhost
spring:
application:
#服务名称
name: eureka-server
到此,Eureka服务发现者已经搭建好。
首先引入依赖pom.xml:
4.0.0
com.springcloud.wsh
springcloud_eureka_client
0.0.1-SNAPSHOT
jar
springcloud_eureka_client
Spring Cloud Eureka服务提供者
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
UTF-8
1.8
Camden.SR6
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient //注册Eureka客户端
public class SpringcloudEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaClientApplication.class, args);
}
}
主要是要指定服务注册中心的地址,端口号等等
server:
port: 2222 #服务端口号
spring:
application:
#服务名称,对应注册到Eureka的实例名称,后续Zuul路由映射的serviceId也是根据这个
name: eureka-client
eureka:
instance:
#主机名
hostname: localhost
client:
serviceUrl:
#服务注册中心的地址,指定这个会向Eureka注册一个名叫eureka-client的客户端
#单节点Eureka服务注册中心,不适用与生产环境,实际生产会用到Eureka Server集群
defaultZone: http://localhost:1111/eureka/
#这里可以定义一些自定义的参数,可以使用@Value("${com.springcloud.author}")获取自定义参数的值
com:
springcloud:
author: weixiaohuai
date: 2018-09-07 10:10
注意:可以引入discoveryClient获取当前服务实例的一些信息。可以使用@Value注解获取在配置文件自定义的一些参数。
//@RestController注解是一个组合注解, @RestController = @Controller + @ResponseBody
@RestController
public class TestController {
private static Logger logger = LoggerFactory.getLogger(TestController.class);
@Autowired
private DiscoveryClient discoveryClient;
//获取配置文件中的自定义参数
@Value("${com.springcloud.author}")
private String author;
@Value("${com.springcloud.date}")
private String date;
@GetMapping("/test")
public String test() {
//获取当前服务的实例
ServiceInstance serviceInstance = discoveryClient.getLocalServiceInstance();
String info = "hello eureka, 主机名:" + serviceInstance.getHost() + ", service_id:" + serviceInstance.getServiceId() + " 作者: " + author + " / 日期: " + date;
logger.info(info);
return info;
}
}
浏览器访问http://localhost:1111/,如下图。可以看到eureka-client已经成功注册到Eureka上面。
接着我们访问http://localhost:2222/test,可以访问到TestController中定义的测试方法:如下图
Eureka内部维护服务节点
的机制:
【a】服务下线
迭代更新
、终止访问
某一个或者多个服务节点
时,在正常关闭服务节点
的情况下,Eureka Client
会告诉Eureka Server
我要下线了,Eureka Server
收到请求后会将该服务实例
的运行状态
由UP
修改为DOWN
【b】失效剔除
Eureka Server
在启动完成后会创建一个定时器每隔60秒
检查一次服务健康状况
,如果其中一个服务节点超过90秒
未检查到心跳,那么Eureka Server
会自动从服务实例列表
内将该服务剔除
。(内存溢出
、杀死进程
、服务器宕机
等非正常流程关闭服务节点
)
【c】自我保护
Eureka Server
的自我保护机制
会检查最近15分钟
内所有Eureka Client
正常心跳的占比,如果低于85%
就会被触发保护机制,当触发自我保护机制
后Eureka Server
就会锁定服务列表
,不让服务列表内的服务过期
,不过这样我们在访问服务时,得到的服务很有可能是已经失效的实例
,如果是这样我们就会无法访问到期望的资源,会导致服务调用失败,所以这时我们就需要有对应的容错机制
、熔断机制
。
关闭自我保护: 在application.properties配置文件中加入代码:
eureka.server.enable-self-preservation=false
到此,我们单节点的Eureka服务注册中心已经搭建完成,本文是笔者在学习SpringCloud的时候的一些总结,仅供参考,大家一起学习,共同进步!