前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Eureka服务发现和注册

Eureka服务发现和注册

作者头像
爱撒谎的男孩
发布2019-12-31 15:49:54
6540
发布2019-12-31 15:49:54
举报
文章被收录于专栏:码猿技术专栏

文章目录

1. Eureka - 服务发现和注册

2. 服务端

3. 客户端

4. 细节的完善

4.1. 微服务名称的改变

4.2. 访问信息显示IP信息提示

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

5. 自我保护机制

6. 服务发现(不重要)

7. 集群配置

7.1. 服务端的配置

7.2. 客户端

8. 完整的配置信息

8.1. 服务端

8.2. 客户端

9. Eureka设置用户名和密码访问

10. Eureka和zookepper的区别

11. 参考文章

Eureka - 服务发现和注册

服务端

  • 新建springBoot项目,选择模块cloud Discovery====>Eureka Server
  • 此时的依赖如下:
代码语言:javascript
复制
<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>
  • 在配置文件中配置基本的信息,如下:
代码语言:javascript
复制
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/,如果出现下图,那么表示启动成功:

客户端

  • 新建springBoot项目,选择cloud Discovery==>Eureka Discovery
  • 新建完成之后,pom文件中的依赖如下:
代码语言:javascript
复制
<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>
  • 配置文件需要配置将该项目注册到之前的服务端中
代码语言:javascript
复制
server:
  port: 8003
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7001/eureka  # eureka的暴露地址,直接注册
spring:
  application:
    name: eureka-client   #应用的名称,在同一个eureka中必须不重复
  • 此时访问http://localhost:7001将会看到如下界面:
  • 通过上图能够看到自己项目已经注册到了eureka中了

细节的完善

微服务名称的改变

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

访问信息显示IP信息提示

代码语言:javascript
复制
eureka.instance.prefer-ip-address=true    ## 显示IP地址

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

  • 之前点击微服务名称之后跳转到之后是一个错误页面,现在我们需要返回这个info信息
  • 添加依赖,如下:
代码语言:javascript
复制
<!--actuator依赖,不需要填写version,由springBoot父类控制	-->			
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 在pom文件中添加build信息,如下:
代码语言:javascript
复制
<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文件中添加信息即可,格式是键值对的形式,如下:
代码语言:javascript
复制
# 说明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 节点会自动退出自我保护模式.
  • 禁用自我保护机制(生产环境中不推荐
代码语言:javascript
复制
eureka:
  server:
    enable-self-preservation: false # 禁用自我保护模式

服务发现(不重要)

  • 为了让别人能够了解这个微服务是干什么的,需要对外暴露一个链接,让别人能够了解到这个微服务是干什么的
  • 在eureka的客户端添加如下controller
代码语言:javascript
复制
@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
代码语言:javascript
复制
@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控制台就会打印如下信息:
代码语言:javascript
复制
EUREKA-PROVIDER	192.168.1.102	http://192.168.1.102:8001
  • 此时在消费端就可以通过restTemplate调用这个服务发现的uri获取服务的信息,此处省略

eureka3.png

集群配置

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

服务端的配置

  • 分别创建三个eureka服务端,如下:
  • 其中每一个eureka服务端的service-url都必须指向其他的服务端,由此形成一个手拉手的模式
  • eureka7001的配置如下:
代码语言:javascript
复制
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的配置如下:
代码语言:javascript
复制
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的配置如下:
代码语言:javascript
复制
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/
  • 以上三个服务端配置完成之后,就可以分别访问以下链接:
代码语言:javascript
复制
http://eureka7001.com:7001/
http://eureka7002.com:7002/
http://eureka7003.com:7003/

客户端

  • 只需要将客户端注册到上面的集群中即可,只需要改变eureka.client.serviceUrl.defaultZone的值为eureka集群中的值,配置如下:
代码语言:javascript
复制
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

完整的配置信息

服务端

代码语言:javascript
复制
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/

客户端

代码语言:javascript
复制
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中必须不重复

Eureka设置用户名和密码访问

Eureka和zookepper的区别

参考文章

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Eureka - 服务发现和注册
  • 服务端
  • 客户端
  • 细节的完善
    • 微服务名称的改变
      • 访问信息显示IP信息提示
        • 微服务info内容的说明(客户端)
        • 自我保护机制
        • 服务发现(不重要)
        • 集群配置
          • 服务端的配置
            • 客户端
            • 完整的配置信息
              • 服务端
                • 客户端
                • Eureka设置用户名和密码访问
                • Eureka和zookepper的区别
                • 参考文章
                相关产品与服务
                微服务引擎 TSE
                微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档