基于Eureka服务治理单节点模式服务搭建

搭建服务注册中心

首先创建一个基于Spring boot的工程,命名为eureka-server,并在pom.xml中引入必要的内容:

	<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>
		</dependency>
	</dependencies>

通过@EnableEurekaServer注解启动一个服务注册中心给其它服务,这一步非常的简单,只需要在一个基础的spring boot 项目主类中添加注解就可以开启,如下:

package com.eureka.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}

}

默认情况下该服务注册中心会将自己作为客户端注册自己,所以我们需要禁用它的客户端行为,只需要在application.properties配置文件中做如下配置:

server.port=9001

eureka.instance.hostname=localhost
#是否将自己注册为服务(不向注册中心注册自己)
eureka.client.register-with-eureka=false
#禁止向注册中心检索服务
eureka.client.fetch-registry=false
#服务地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
#是否关闭自我保护机制
eureka.server.enable-self-preservation=true
  • eureka.client.register-with-eureka 由于该应用是注册中心,所以设置为false,代表不向注册中心注册自己。
  • eureka.client.fetch-registry 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以设置为false。

在完成上面的配置后,启动应用并访问http://localhost:9001/,可以看到如下图中的Eureka信息面板,其中Instances currently registered with Eureka信息栏为空,说明还没用注册任何服务。
在这里插入图片描述

注册服务提供者

在完成注册中心的搭建后,我们创建一个基础的spring boot应用eureka-client,在pom.xml中添加服务依赖。

	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	
		<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-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

在启动类上添加@EnableEurekaClient注解激活Eureka中的DiscoveryClient实现:

package com.eureka.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}

}

最后我们需要在application.properties中添加spring.application.name来为服务命名,通过eureka.client.service-url.defaultZone来指定注册中心的地址,完整配置如下:

spring.application.name=service-test

eureka.client.service-url.defaultZone=http://localhost:9001/eureka

启动eureka-client服务,我们可以通过控制台看到服务成功的注册:

2018-12-18 20:07:12.403  INFO 7352 --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp 1545134832291 with initial instances count: 0
2018-12-18 20:07:12.407  INFO 7352 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application SERVICE-TEST with eureka with status UP
2018-12-18 20:07:12.408  INFO 7352 --- [           main] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1545134832408, current=UP, previous=STARTING]
2018-12-18 20:07:12.455  INFO 7352 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICE-TEST/yaomingyang-bjb.go-goal.com:service-test: registering service...
2018-12-18 20:07:12.514  INFO 7352 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-12-18 20:07:12.524  INFO 7352 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2018-12-18 20:07:12.527  INFO 7352 --- [           main] c.eureka.client.EurekaClientApplication  : Started EurekaClientApplication in 6.747 seconds (JVM running for 7.312)
2018-12-18 20:07:12.879  INFO 7352 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICE-TEST/yaomingyang-bjb.go-goal.com:service-test - registration status: 204

也可以通过Eureka的信息面板Instances currently registered with Eureka一栏中看到服务的注册信息。
在这里插入图片描述

自我保护

当我们在本地调试Eureka单机模式程序时,经常会遇到如下问题,在服务注册中心的信息面板上会出现 如下警告信息:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

实际上上面的警告就是触发了Eureka Server的自我保护机制;服务注册到Eureka Server注册中心后会维护一个心跳连接,告诉Eureka Server注册中心我还活着。Eureka Server注册中心会统计心跳失败的比例在在15分钟内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境中通常由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这心注册信息。但是, 在这段保护期间内实例若出现问题, 那么客户端很容易拿到实际已经不存在的服务实例, 会出现调用失败的清况, 所以客户端必须要有容错机制, 比如可以使用请求重试、断路器等机制。

由于本地调试很容易触发注册中心的保护机制, 这会使得注册中心维护的服务实例不那么准确。所以, 我们在本地进行开发的时候, 可以使用eureka.server.enable-self-preservation=false 参数来关闭保护机制, 以确保注册中心可以将不可用的实例正确剔除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值