springcloud学习(一)之Eureka
前言
微服务原则上是应该有多个服务提供者的实例的,在通常情况下服务提供者的数量和分布往往是动态变化的,这样在传统的单体应用中的那种硬编码服务url进行远程调用的方式就不足取。服务注册中心就是为了解决服务之间的注册与发现而产生的。
服务注册中心本质上是为了解耦服务提供者和服务消费者。
服务注册中心的一般原理

服务注册中心的一般原理:
- 服务注册中心启动
- 服务提供者启动,并注册到服务注册中心
- 服务消费者从注册中心获取服务信息
- 服务消费者远程调用服务提供者
主流服务注册中心对比
Zookeeper
Zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主要是⽤来解决分布式应⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。
简单来说zookeeper本质=存储+监听通知。
Zookeeper ⽤来做服务注册中⼼,主要是因为它具有节点(znode)变更通知功能,只要客户端监听相关服务节点,服务节点的所有变更,都能及时的通知到监听客户端,这样作为调⽤⽅只要使⽤Zookeeper 的客户端就能实现服务节点的订阅和变更通知功能了,⾮常⽅便。另外,Zookeeper可⽤性也可以,因为只要半数以上的选举节点存活,整个集群就是可⽤的。
Eureka
由Netflix开源,并被Pivatal集成到SpringCloud体系中,它是基于 RestfulAPI ⻛格开发的服务注册与发现组件。
Consul
Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采⽤Raft算法保证服务的⼀致性,且⽀持健康检查。
Nacos
Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos就是 注册中⼼ + 配置中⼼的组合,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。 Nacos 是 Spring Cloud Alibaba 核⼼组件之⼀,负责服务注册与发现,还有配置。
CAP原理三者对比:

Eureka基础架构


Eureka 包含两个组件:Eureka Server 和 Eureka Client, Eureka Client是⼀个Java客户端,⽤于简化与Eureka Server的交互; Eureka Server提供服务发现的能⼒,各个微服务启动时,会通过Eureka Client向Eureka Server 进⾏注册⾃⼰的信息(例如⽹络信息),Eureka Server会存储该服务的信息;
详细流程如下:
服务提供者向Eureka Server中注册服务, Eureka Server接受到注册事件会在集群和分区中进⾏数据同步,Application Client作为消费端(服务消费者)可以从Eureka Server中获取到服务注册信息,进⾏服务调⽤。微服务启动后,会周期性地向Eureka Server发送⼼跳(默认周期为30秒)以续约⾃⼰的信息
Eureka Server在⼀定时间内没有接收到某个微服务节点的⼼跳, Eureka Server将会注销该微服务节点(默认90秒)
每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的⽅式完成服务注册列表的同步
Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使⽤缓存中的信息找到服务提供者
下面我们来分别进行Eureka单实例及集群环境的搭建及使用(仅列出部分关键代码,详细代码请看文末源码):
搭建单实例EurekaServer
新建父工程lagou-parent,在pom.xml中统一规定springcloud的版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
新建一个子模块spring-cloud-eureka-server8761,
添加依赖
<!--Eureka server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在启动类上面添加@EnableEurekaServer注解,表明此工程为EurekaServer服务工程。
application.yml:
#eureka server服务端口
server:
port: 8761
spring:
application:
name: lagou-cloud-eureka-server # 应用名称,应用名称会在Eureka中作为服务名称
# eureka 客户端配置(和Server交互),Eureka Server 其实也是一个Client
eureka:
instance:
hostname: localhost # 当前eureka实例的主机名
client:
service-url:
# 配置客户端所交互的Eureka Server的地址(Eureka Server集群中每一个Server其实相对于其它Server来说都是Client)
# 集群模式下,defaultZone应该指向其它Eureka Server,如果有更多其它Server实例,逗号拼接即可
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
register-with-eureka: false # ⾃⼰就是服务不需要注册⾃⼰ 集群模式下可以改成true
fetch-registry: false # ⾃⼰就是服务不需要从Eureka Server获取服务信息,默认为true,集群模式下可以改成true
执行启动类,浏览器访问http://localhost:8761/,出现以下界面说明启动成功。

对界面上的信息进行说明:



至此,单个Eureka server搭建完成。
EurekaServer集群搭建
在上面单体Eureka server的基础上搭建Eureka集群。
为了模拟服务器集群的效果,修改本机hosts文件:C:\Windows\System32\drivers\etc\hosts
127.0.0.1 LagouCloudEurekaServerA
127.0.0.1 LagouCloudEurekaServerB
在原有工程上新建一个Eureka server模块,命名为spring-cloud-eureka-server8762,
spring-cloud-eureka-server8761和spring-cloud-eureka-server8762的application.yml文件如下:
8761:
#eureka server服务端口
server:
port: 8761
spring:
application:
name: lagou-cloud-eureka-server # 应用名称,应用名称会在Eureka中作为服务名称
# eureka 客户端配置(和Server交互),Eureka Server 其实也是一个Client
eureka:
instance:
hostname: LagouCloudEurekaServerA # 当前eureka实例的主机名
client:
service-url:
# 配置客户端所交互的Eureka Server的地址(Eureka Server集群中每一个Server其实相对于其它Server来说都是Client)
# 集群模式下,defaultZone应该指向其它Eureka Server,如果有更多其它Server实例,逗号拼接即可
defaultZone: http://LagouCloudEurekaServerB:8762/eureka/
register-with-eureka: true # ⾃⼰就是服务不需要注册⾃⼰ 集群模式下可以改成true
fetch-registry: true # ⾃⼰就是服务不需要从Eureka Server获取服务信息,默认为true,集群模式下可以改成true
8762:
#eureka server服务端口
server:
port: 8762
spring:
application:
name: lagou-cloud-eureka-server
eureka:
instance:
hostname: LagouCloudEurekaServerB
client:
service-url:
defaultZone: http://LagouCloudEurekaServerA:8761/eureka/
register-with-eureka: true
fetch-registry: true
浏览器中访问
http://LagouCloudEurekaServerA:8761/eureka/
及
http://LagouCloudEurekaServerB:8762/eureka/
效果如下:
8761:

8762:

注册服务提供者到EurekaServer
父工程中引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
服务提供者微服务中引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
服务提供者微服务applicaion.yml:
# Eureka配置
eureka:
client:
service-url:
defaultZone: http://LagouCloudEurekaServerA:8761/eureka/,http://LagouCloudEurekaServerB:8762/eureka/ #把 eureka 集群中的所有 url 都填写了进来,也可以只写⼀台,因为各个eureka server可以同步注册表
instance:
prefer-ip-address: true #使⽤ip注册,否则会使⽤主机名注册了(此处考虑到对⽼版本的兼容,新版本经过实验都是ip)
#⾃定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
instance-id: ${spring.cloud.client.ipaddress}:${spring.application.name}:${server.port}:@project.version@
服务提供者启动类添加注解 @EnableDiscoveryClient或@EnableEurekaClient。
说明:
1)从Spring Cloud Edgware版本开始, @EnableDiscoveryClient 或 EnableEurekaClient
可省略。只需加上相关依赖,并进⾏相应配置,即可将微服务注册到服务发现组件上。
2)@EnableDiscoveryClient和@EnableEurekaClient⼆者的功能是⼀样的。但是如果选⽤的是eureka服务器,那么就推荐@EnableEurekaClient,如果是其他的注册中⼼,那么推荐使⽤
@EnableDiscoveryClient,考虑到通⽤性,后期我们可以使⽤@EnableDiscoveryClient
启动测试:
启动EurekaServer,可以看到服务提供者实例已经成功注册到EurekaServer上:

注册服务消费者到EurekaServer
注册服务消费者和服务提供者类似,pom中添加依赖,在启动类添加@EnableDiscoveryClient,在application.yml中添加eureka的配置信息。
可以看到服务消费者信息成功注册到EurekaServer上:

服务提供者调用服务消费者(通过eureka)
package com.lagou.edu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class AutoDeliverController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/checkState/{userId}")
public Integer findResumeOpenState(@PathVariable Long userId) {
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("lagou-service-resume");
ServiceInstance serviceInstance = serviceInstanceList.get(0);
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
String url="http://"+host+":"+port+"/resume/openstate/"+userId;
Integer forObject =restTemplate.getForObject(url,Integer.class);
System.out.println("======>>>从eureka server获取服务提供者实例:"+url);
return forObject;
}
}
调用成功信息如下:

源码地址
源码地址:eureka-demo 源码
springcloud学习(一)之Eureka的更多相关文章
- SpringCloud学习心得之Eureka注册中心的基本使用
SpringCloud学习心得——Eureka注册中心 示范代码链接 定义 SpringCloud Eureka是 SpringCloud Netflix微服务套件的一部分,基于 REST 的服务 ...
- SpringCloud学习之【Eureka实现服务注册与发现】
这段时间开始整理之前的SpringCloud实践笔记,这里感谢翟永超大佬的文章SpringCloud从入门到精通的指导. 项目结构 服务注册中心 注意: 1.SpringCloud与SpringBoo ...
- springcloud学习03-spring cloud eureka(下)
7.配置服务提供者(生产者) 7.1.配置resources/application.yml. 值eureka.client.service-url(或serviceUrl).defaultZone是 ...
- SpringCloud学习笔记(1)——Eureka
Spring Cloud Spring Cloud为开发者快速构建通用的分布式系统(例如:配置管理.服务发现.断路器.智能路由.微代理.控制总线.一次性的Token.全局锁.领导者选举.分布式会话.集 ...
- SpringCloud学习笔记(6)——Eureka高可用
参考Spring Cloud官方文档第12章12.3.12.5.12.6小节 12.3 High Availability, Zones and Regions 默认情况下,每一个Eureka服务器同 ...
- SpringCloud学习之搭建eureka集群,手把手教学,新手教程
一.为什么需要集群 上一篇文章讲解了如何搭建单个节点的eureka,这篇讲解如何搭建eureka集群,这里的集群还是本地不同的端口执行三个eureka,因为条件不要允许,没有三台电脑,所以大家将就一下 ...
- springcloud学习03-spring cloud eureka(上)
对eureka一个大概介绍:https://blog.csdn.net/u010623927/article/details/88762525 这里面有个我做dubbo时的一个理解的错误:服务注册中不 ...
- SpringCloud学习之【NACOS实现服务的注册与发现】
根据nacos官方的介绍,Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. 具有服务发现和服务健康监 ...
- SpringCloud学习心得—1.3—Eureka与REST API
SpringCloud学习心得—1.3—Eureka与REST API Eureka的REST API接口 API的基本访问 Eureka REST APIEureka 作为注册中心,其本质是存储 ...
- SpringCloud学习心得—1.2—Eureka注册中心的密码认证、高可用的设置
SpringCloud学习心得—1.2—Eureka注册中心的密码认证.高可用的设置 这是相关代码 链接 Eureka开启密码配置 添加依赖 <dependency> <grou ...
随机推荐
- bugku never give up
打开网页,看到?id=1,很容易想到了爆破. 然后bp抓包爆破.(传说中的一秒爆破.) 看到了 1p.html . 直接访问 缓缓打出一个?(这是个锤子o,本来以为这里有flag,但是,这真的是论坛啊 ...
- leetcode计划
5.17 星期日,应完成的下周leetcode题目:279,300,1143,72,(前4个动态规划),104,110,543(后三个关于树)(https://cyc2018.github.io/CS ...
- Java对象操作工具
对象复制(反射法) public static void copyProp(Object from, Object to, String... filterProp) { HashSet<Str ...
- ARC109D - L
平面上一开始有三个点\((0,0),(0,1),(1,0)\)形成成L形(点连续),每次操作可以将一个点改变位置,使得得到的仍然是L形.给出终止L形的位置,问移动的最小步数. \(|x|,|y|\le ...
- 题解-洛谷P6788 「EZEC-3」四月樱花
题面 洛谷P6788 「EZEC-3」四月樱花 给定 \(n,p\),求: \[ans=\left(\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y ...
- 【Codeforces 1181E】A Story of One Country (Easy & Hard)(分治 & set)
Description 在一个二维平面上有若干个矩形.定义一个矩形的(或有边在无限远处)区域为符合条件的条件为: 这个区域仅包含一个矩形,且不能使边界穿过任何一个矩形的内部. 这个区域可以用一个水平或 ...
- git学习——git命令之创建版本库和版本退回
原文来至 一.创建版本库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追 ...
- DarkMode(1):产品应用深色模式分析
为什么Dark Mode变得越来越流行 2018 年的 macOS Mojave 率先支持了深色外观,紧接着 Windows 10 在 2018 年的 10 月份大版本更新中,也引入了 Dark Mo ...
- 新手关于C++ cin 的返回值
cin是C++的标准输入流,其本身是一个对象,并不存在返回值的概念. 不过经常会有类似于 while(cin>>a) 的调用,这里并不是cin的返回值,应该关注">> ...
- 升级jenkins之后无法启动 报错Unable to read /var/lib/jenkins/config.xml
故障记录 点击jenkins升级后再点击回滚到之前版本,jenkins就起不来了. 欲哭无泪,报错如下 hudson.util.HudsonFailedToLoad: org.jvnet.hudson ...