转载

Eureka服务发现和注册

  • 新建springBoot项目,选择模块 cloud Discovery ====> Eureka Server
  • 此时的依赖如下:
<dependencies>
		<!-- eureka的服务端 -->		
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
  • 在配置文件中配置基本的信息,如下:
server:
port: 7001
eureka:
instance:
hostname: localhost   ## 实例名称
client:
fetch-registry: false # 注册中心不向自己注册自己
register-with-eureka: false # 表示是否将自己注册到Eureka Server,不去检索服务
service-url:
      # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.默认是http://localhost:7001/eureka/;多个地址可使用','风格.
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 在启动类上添加 @EnableEurekaServer 这个注解即可启动
  • 启动在本地访问: http://localhost:7001/ ,如果出现下图,那么表示启动成功:
  • Eureka服务发现和注册

客户端

  • 新建springBoot项目,选择 cloud Discovery ==> Eureka Discovery
  • 新建完成之后,pom文件中的依赖如下:
<dependencies>
    	<!--eureka客户端的依赖-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
  • 配置文件需要配置将该项目注册到之前的服务端中
server:
port: 8003
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka  # eureka的暴露地址,直接注册
spring:
application:
name: eureka-client   #应用的名称,在同一个eureka中必须不重复
  • 此时访问 http://localhost:7001 将会看到如下界面:
  • Eureka服务发现和注册

  • 通过上图能够看到自己项目已经注册到了eureka中了

细节的完善

微服务名称的改变

  • 通过上面的图形可以看到默认的名称是 192.168.1.1:eureka-client:8003 ,现在我们需要改变名称,让开发者能够一目了然的知道这个服务是干什么的,配置如下:
eureka.instance.instance-id=eureka-client:8003  #改变微服务的名称

访问信息显示IP信息提示

eureka.instance.prefer-ip-address=true    ## 显示IP地址

微服务info内容的说明(客户端)

  • 之前点击微服务名称之后跳转到之后是一个错误页面,现在我们需要返回这个info信息
  • 添加依赖,如下:
<!--actuator依赖,不需要填写version,由springBoot父类控制 -->			
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 在pom文件中添加build信息,如下:
<build>
	<resources>
		<resource>
			<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>
					<delimiter>$</delimiter>
				</delimiters>
			</configuration>
		</plugin>
	</plugins>
</build>
  • 之后只需要在 src/main/resuorces/application.yml 文件中添加信息即可,格式是键值对的形式,如下:
# 说明info的信息,key-value的形式
info:    
  app.name: eureka-client
  company.name: http://chenjiabing666.github.io
groupId: $project.groupId$
artifactId: $project.artifactId$
version: $project.version$

自我保护机制

  • 在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就会注销这个实例(默认是90秒).
    但是当网路分区发生故障时,微服务与Eureka Server之间无法正常通信,以上行为就可能非常危险,因为微服务本身是健康的,此时本不应该注销这个服务的.
  • Eureka 通过 自我保护模式 来解决这个问题,当Eureka Server节点在 短时间内丢失过多客户端时(可能发生了网络分区故障) ,那么这个节点就会进入自我保护模式。一旦进入这个模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不注销任何微服务).当网络故障恢复后,这个Eureka Server

    节点会自动退出自我保护模式.

  • 禁用自我保护机制( 生产环境中不推荐

eureka:
server:
enable-self-preservation: false # 禁用自我保护模式

服务发现(不重要)

  • 为了让别人能够了解这个微服务是干什么的,需要对外暴露一个链接,让别人能够了解到这个微服务是干什么的
  • 在eureka的客户端添加如下controller
@RestController
public class DeptController{
	@Resource
	private DiscoveryClient discoveryClient;  //服务发现的client
	/**
	 * 服务发现
	 * @return
	 */
	@GetMapping("/dept/discovery")
	public Object discovery(){
		List<String> list=discoveryClient.getServices();  //获取所有的微服务实例
		System.out.println(list);
        //根据为微服务的名称获取实例
		List<ServiceInstance> serviceList=discoveryClient.getInstances("EUREKA-PROVIDER");
		for (ServiceInstance element : serviceList) {
			System.out.println(element.getServiceId()+"/t"+element.getHost()+"/t"+element.getUri());
		}
		return this.discoveryClient;
	}
}
  • 在主启动类上添加注解开启服务发现: @EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient   	//eureka服务客户端
@EnableDiscoveryClient  //eureka服务发现
public class EurekaProvider8001Application{
	public static void main(String[] args){
		SpringApplication.run(EurekaProvider8001Application.class, args);
	}
}
  • 此时访问 http://localhost:8001/eureka-provider/dept/discovery 控制台就会打印如下信息:
EUREKA-PROVIDER	192.168.1.102	http://192.168.1.102:8001
  • 此时在消费端就可以通过restTemplate调用这个服务发现的uri获取服务的信息,此处省略

eureka3.png

集群配置

  • 在本地模拟开启三个注册中心server,在hosts文件中添加如下的地址:
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com

服务端的配置

  • 分别创建三个eureka服务端,如下:

  • Eureka服务发现和注册

  • 其中每一个eureka服务端的service-url都必须指向其他的服务端,由此形成一个手拉手的模式

  • eureka7001的配置如下:
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com   # 配置主机的名称,之前是需要在hosts文件中做映射的
client:
fetch-registry: false # 注册中心不向自己注册自己
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
service-url:
      # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址,多个地址可使用','风格,配置集群必须指向除自己之外的其他的eureka服务的地址
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  • eureka7001的配置如下:
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com # 配置主机的名称,之前是需要在hosts文件中做映射的
client:
fetch-registry: false # 注册中心不向自己注册自己
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
service-url:
      # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址,多个地址可使用','风格,配置集群必须指向除自己之外的其他的eureka服务的地址
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
  • eureka7001的配置如下:
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com
client:
fetch-registry: false # 注册中心不向自己注册自己
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
service-url:
      # 设置与Eureka Server的地址
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
  • 以上三个服务端配置完成之后,就可以分别访问以下链接:
http://eureka7001.com:7001/
http://eureka7002.com:7002/
http://eureka7003.com:7003/

客户端

  • 只需要将客户端注册到上面的集群中即可,只需要改变 eureka.client.serviceUrl.defaultZone 的值为eureka集群中的值,配置如下:
server:
port: 8003
eureka:
client:
serviceUrl:   
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/  # eureka的暴露地址,指向集群中每一个eureka,多个用都好分隔
instance:
instance-id: eureka-client:8003    ## 改变eureka中显示微服务的名称
prefer-ip-address: true       ## 访问路径可以显示服务主机的IP地址
spring:
application:
name: eureka-client   #应用的名称,在同一个eureka中必须不重复

# 说明info的信息,key-value的形式
info:    
  app.name: eureka-client
  company.name: http://chenjiabing666.github.io

完整的配置信息

服务端

server:
port: 7001
eureka:
# server:
# enable-self-preservation: false ##禁用自我保护机制,但是生产环境中不推荐
instance:
hostname: localhost
client:
fetch-registry: false # 注册中心不向自己注册自己
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
service-url:
      # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.默认是http://localhost:8761/eureka/;多个地址可使用','风格.
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

客户端

server:
port: 8003
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka/  # eureka的暴露地址,直接注册
instance:
instance-id: eureka-client:8003    ## 改变eureka中显示微服务的名称
prefer-ip-address: true       ## 访问路径可以显示服务主机的IP地址
spring:
application:
name: eureka-client   #应用的名称,在同一个eureka中必须不重复
原文  https://chenjiabing666.github.io/2018/12/25/Eureka服务发现和注册/
正文到此结束
Loading...