SpringCloud Eureka

springcloud eureka server 官方文档

springcloud eureka client 官方文档

springcloud中的region和zone

1、背景

用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房。这个时候如果上线springcloud服务,我们希望一个机房内的服务优先调用同一个机房的服务,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用。

2、概念

eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS:

(1)region:可以简单理解为地理上的分区,比如亚洲地区,或者华北地区,再或者北京等待,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。

(2)zone:可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以在此region之下划分出zone1, zone2两个zone。

 

默认情况下,每个Eureka server也是一个Eureka client,需要至少配置一个service URL来定位同伴,如果你不提供它也可以正常工作,但是会输出一个错误日志表示无法连接到注册中心。

单例模式

在这种模式下,你可能会更愿意关闭客户端的行为,这样它就不会一直试图连接它的peers。

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

注意它的serviceUrl指向了它本身。

集群

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/

在上线这个例子中,通过不同的spring profiles,我们在两个主机上运行了同一个server。

服务注册

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

在这里我们使用@EnableEurekaClient,其实也可以使用@EnableDiscoveryClient。配置中需要定位到Eureka server

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

默认的应用名(sercie id),虚拟主机名和非加密端口,都源于Environment。${spring.application.name}, ${spring.application.name}, ${server.port}。

 

实战

1、首先创建一个maven主工程。

2、然后创建2个model工程:一个model工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client。

(1)右键工程-》创建model->选择spring initialir。

(2)下一步-》选择cloud discovery->eureka server然后一直下一步就行了。

3、启动一个服务注册中心,只需要一个注册@EnableEurekaServer


@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(EurekaserverApplication.class, args);
    }

(1)eureka server的配置文件application.yml


server:
  port: 8761
 
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

(2)eureka server是有界面的,启动工程,打开浏览器访问http://localhost:8761

4、创建client过程同server类似。

(1)通过注解@EnableEurekaClient表明自己是一个eurekaclient

@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ServiceHiApplication.class, args);
    }
 
    @Value("${server.port}")
    String port;
    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        return "hi "+name+",i am from port:" +port;
    }
 
}

(2)仅仅@EnableEurekaClient是不够的,还需要在配置文件中注明自己的服务注册中心的地址

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8762
spring:
  application:
    name: service-hi

需要指明spring.application.name,这个很重要,这个以后的服务与服务之间相互调用一般都是根据这个name.

版本

1、大版本

Spring Cloud并没有熟悉的数字版本号,而是对应一个开发代号,

Finchley 版本是绝对的大版本,对应Boot为2.x.

2、小版本

(1)SNAPSHOT:快照版本,随时可能修改。

(2)M:MileStore,M1表示第1个里程版本,一般同时标注PRE,表示预览版本。

(3)SR:Service Release, SR1表示第1个正式版本,一般同时标注GA(GenerallyAvailable)表示稳定版本。

 

Eureka Server相关配置

#服务注册中心端口号
server.port=8761
#服务注册中心实例的主机名
eureka.instance.hostname=localhost
#是否向服务注册中心注册自己
eureka.client.register-with-eureka=false

服务续约

1、eureka.instance.lease-expireation-duration-in-seconds

表示eureka server至上一次收到client的心跳之后,等待下一次心跳的起时时间,在这引时间内若没收到下一次心跳,则将移除该instance。

(1)默认为90s

(2)至少大于leastRenewallIntervalInSeconds

2、eureka.instance.lease-renewal-interval-in-seconds

表示eureka client发送心跳给server端的频率,如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance。除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也没会接收到流量。

(1)默认30s

(2)只有当实例、服务端和客户端的本地缓存中的元数据都相同时,服务才能被其他客户端发现(所以可能需要3次心跳)。

在开发或测试时,常常希望加速这一过程,从而提高工作效率,所以保需要将此值设置的更小。生产环境,建议采用默认值。

IpAddress

1、eureka.instance.prefer-ip-address

(1)我们通过eureka.instance.prefer-ip-address=true配置项,可以找到源码

@Override
public String getHostName(boolean refresh) {
	if (refresh && !this.hostInfo.override) {
		this.ipAddress = this.hostInfo.getIpAddress();
		this.hostname = this.hostInfo.getHostname();
	}
	return this.preferIpAddress ? this.ipAddress : this.hostname;
}

从这里我们可以知道 ,为什么配置eureka.instance.prefer-ip-address=true就可以将ip注册到Eureka Server上,而如果不配置就是机器的主机名。如果只配置这项,会自动获取第一个非回环ip地址。

2、eureka.instance.ip-address

手动设置ip

已停止的微服务节点注销慢或不注销

1、原因

在开发环境下,常常希望Eureka 能快速有效地注销已停止的微服务实例。然而,由于Eureka海底两万里无效节点周期长(默认90s),以及自我保护模式等原因,可能会遇到微服务注销慢甚至不注销的问题。

2、解决方法

(1)Eureka Server端

配置关闭自我保护,并按需配置Eureka Server清理无效节点的时间间隔。

eureka.server.enable-self-preservation设置为false。

设置清理间隔(单位ms,默认是60*1000)

eureka.server.eviction-interval-time-in-ms.

(2)Eureka Client端

配置开启分离检查,默认情况下注册到eureka server的服务是通过心跳来告知自己是up还是down,并不是通过spring-boot-actuator模块的/health端点来实现的,这样其实不是很合理。

由于大多数微服务应用都会有一些其他的外训资源依赖,比如数据库,REDIS缓存等,如果我们的应用与这些外产资源无法连接的时候,实际上已经不能提供正常的对外服务了。

我们可以通过eureka客户端中配置eureka.client.healthcheck.enabled=true,改变用actuator的/heath端点来检测。

修改续约更新时时间间隔(默认30s)

eureka.instance.lease-renewal-interval-in-seconds

修改续约到期时间

eureka.instance.lease-expireation-duration-in-seconds(默认90s)

eureka的unknown问题

注册unknown问题,一般分两种情况,一种是应用名称unknown,另外一种是应用状态unknown。

1、应用名称unknown

未配置spring.application.name或者eureka.instance.appname属性。

2、微服务实例状态unknown

微服务实例的状态unknown一般来说,只会请求状态是up的微服务,该问题一般由监控检查导致。eureka.client.health.enabled=true必须设置在application.yml中,而不能设置在bootstrap.yml中,否则一些场景下会导致unknown的问题。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值