Spring Cloud学习笔记之Eureka服务注册与发现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qwqw3333333/article/details/82221839

Eureka就像一个物业管理公司,其他微服务就像小区的住户,每个住户入住时都要向物业管理公司注册,并定时向物业公司交管理费。

介绍:

  1. Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
  2. Eureka主管服务注册与发现,在微服务中,以后了这两者,只需要使用服务的标识符(就是那个在每个服务的yml文件中取得服务名称),就可以访问到服务,不需要修改服务调用的配置文件。
  3. Eureka遵循AP原则(高可用,分区容错性),因为使用了自我保护机制所以保证了高可用。

原理:

  1. Eureka使用的是C-S结构(客户端-服务端)
  2. 两大组件:Eureka Server(提供注册服务)、 Eureka Client(JAVA客户端,负责发送心跳)
  3. 系统中的其他微服务使用Eureka客户端连接到Eureka服务端维持心跳连接(即注册)。SpringCloud的其他模块可以通过Eureka Server 来发现系统中的微服务并加以调用

架构图:

Eureka服务注册中心构建

加入服务端依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

配置yml

理解:物业公司肯定不向自己注册自己,并肯定知道自己在哪,不用参加检索

server:
  port: 7001
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己
    fetch-registry: false           #false表示自己就是注册中心,职责是维护实例,不参加检索
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #设置eureka server的交互地址,即对外暴露的地址

添加启动类

注意:要在类前加@EnableEurekaServer标注

package com.XXX;

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

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

验证是否构建成功:启动主程序,访问该服务地址即可

------------------------------------------------------------------黄金分割线--------------------------------------------------------------------------

向Eureka注册中心注册微服务

增加依赖:在要注册的微服务的pom.xml文件中增加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency> 

修改yml

(1)在application.yml中增加以内容,将客户端注册到服务列表内

(2)理解:小区用户要找到物业管理处的地址进行注册

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

主启动类增加注解:@EnableEurekaClient

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

actuator与微服务注册完善

修改服务名称,在yml中eureka节点下添加如下内容

eureka:
  instance:
    instance-id: microservice-dept8001       #修改别名
    prefer-ip-address: true     #显示IP地址

修改前:

修改后:

info内容的详细信息修改

作用:在查看Eureka时点击进入某个微服务的info时,能给查看者一些必要的信息,可以帮助查看者快速的了解该微服务,开发中十分有意义。

修改方法:

(1)当前工程添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(2)总的父工程的build节点下添加如下内容

<build>
	<finalName>microservice</finalName>
	<resources>
		<resource>
			<!--允许访问该工程src/main/resources路径下所有内容-->
			<directory>src/main/resources</directory>
			<filtering>true</filtering>
		</resource>
	</resources>
	<plugins>
		<plugin>
			<!--负责解析的插件-->
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<configuration>
				<delimiters>
					<!--内容只要以$开头和以$结尾的信息都可以进行动态读取-->
					<delimit>$</delimit>
				</delimiters>
			</configuration>
		</plugin>
	</plugins>
</build>

(3)在当前工程的application.yml文件添加以下信息

info:
  author: 陈玉林
  app.name: microservice
  company.name: www.xxxx.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

Eureka的自我保护

介绍

Eureka的自我保护机制主要是为了网络异常时保持高可用设计的,当在Eureka中注册的微服务超过设定是时间内(默认90秒)没有向Eureka服务端发送心跳,该微服务会进入自我保护模式。在自我保护模式中,Eureka会保护服务注册表中的信息,不会注销任何服务实例,直至收到的心跳数恢复至阈值以上,该微服务退出自我保护模式。

理解

好死不如赖活:Eureka的设计哲学是宁可保留错误的服务信息,也不盲目注销可能健康的服务。所以异常的服务不会被注销,而是进入了自我保护模式。

自我保护模式的开关

在Eureka Server模块下的yml文件中添加配置信息即可,true表示打开自我保护模式;false表示关闭自我保护模式(不推荐)

server:
    enable-self-preservation: false

------------------------------------------------------------------黄金分割线--------------------------------------------------------------------------

Eureka的服务发现

介绍

系统中的微服务可以通过Eureka的服务发现去获得在Eureka中注册的服务的信息,这是一个对外暴露的接口。

使用方法(provider中)

(1)注入DiscoveryClient 对象(spring包下的),在controller方法中获取

@Autowired
private DiscoveryClient discoveryClient;    

@ResponseBody
@GetMapping("/provider/discovery")
public Object discovery(){
	List<String> list = discoveryClient.getServices();
	System.out.println(list);
	List<ServiceInstance> insList = discoveryClient.getInstances("MICROSERVICE-DEPT");
	for (ServiceInstance si:insList) {
		System.out.println(si.getHost() +"," + si.getServiceId() +"," +si.getPort() +"," +si.getUri() +"," +si.getMetadata());
	}
	return this.discoveryClient;
}

(2)在主启动类中加入@EnableDiscoveryClient注解

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

启动eureka服务端和该服务工程,访问localhost:8001/dept/discovery

使用方法(consumer中)

在controller方法中使用restTemplate对象调用provider中暴露的URL 并获得返回对象即可

@GetMapping("/discovery")
public Object discovery() {
	return restTemplate.getForObject(URL_PREFIX+"/provider/discovery",Object.class);
}

启动该消费工程,访问localhost/consumer/dept/discovery

猜你喜欢

转载自blog.csdn.net/qwqw3333333/article/details/82221839