赞
踩
个人主页:https://blog.csdn.net/hello_list?type=blog
前言
这里博主从说更新springcloud,发了第一篇之后好久又没更新了,这里不是没有学习了,其实我都已经把文章全部写好了,整个springcloud的,几大组件,所以大家在看文章的时候可以依赖会有变动,因为比如Eureka用着没什么问题,之后有用到Ribbon,zull可能依赖就有问题了,需要更换,不过也可能不会换前面的,所以大家还是可以出了问题就换依赖试一下
这里我么就说明了什么,如果发现有错误,大部分都是依赖问题,springcloud本身没有太多编码什么的,大多导依赖然后配置,不是依赖不行了,就是配置错了,很简单的,这里博主也都写好了,慢慢就都发出来了,所以大家可以关注点赞收藏不迷路!!!
学习Eureka那我们就要知道Eureka是什么,前面我们学过zookeeper了,注册中心,Eureka就是springcloud下被spring共公司封装了的注册中心,但是与zookeeper不同,具体不同,我觉得多说无益,都用一下就知道哪里不同了,下面是我从别人哪里复制的,可以看下这样的说话。
Eureka是Netflix的有个子模块,也是核心模块之一。Eureka是基于REST的服务,用于定位服务,以实现云端中间件层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper
Eureka基本的架构
Eureka的架构设计图
新建一个普通的maven项目,导入eureka依赖,做一个注册中心,新建一个项目名springcloud-eureka-7001,还是那几个步骤,微服务就这么简单,我觉得比起成吨的java代码,理论上也好理解
1、导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2、编写配置
新建application.yml文件
server:
port: 7001
# Eureka配置
eureka:
instance:
hostname: localhost # Eureka实例名称
client:
# 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
register-with-eureka: false
fetch-registry: false
service-url:
#监控页面,这里改成我们自己定义的
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
3、开启功能
创建springboot启动类
@SpringBootApplication
@EnableEurekaServer //开启eureka服务端功能
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
启动程序,启动成功,访问http://localhost:7001/这里就是注册中心页面
同样的,这里我们直接注册8001服务
1、导入依赖,一会儿还有一个问题,我们稍后再说
<!--Eureka依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--完善监控信息-->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、编写配置,这里是我们服务端配置,自动去注册中心注册
# Eureka配置,注册服务
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: springcloud-provider-account8001 # 修改默认描述信息
3、开启功能,加到springboot启动类上
@EnableEurekaClient //启动客户端服务
启动项目,可以看到,我们的服务就被注册了进来
这个时候我们关闭8001服务,我们等待下,可以看到这样的报错,其实这就是euraka的自我保护机制,当服务出现宕机等问题时候,注册中心并不会立马清除服务,而且会保存服务等待服务恢复
不难理解吧,其实就是保持不会立马清楚这个服务,如果想深入了解下这个机制,可以自行了解,反正不难的很简单。
当我们点击1的时候,我们发现跳转到2这个地址页面,是不是404什么都没有,这是因为我们还没有配置,这里我们可以添加服务的描述信息,这个地方我这里出问题了,最后参考这个文章配置了下,大家可以看看:(4条消息) Eureka 遇到/actuator/info不显示_dyao23的博客-CSDN博客_/actuator/info
1、导入actuator依赖,上面我们已经导入了,因为我这里出不来,所以加了这个插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2、编写配置,我这里也加了相对应的management配置
# 导入actuator可以完善监控信息配置
info:
app.name: springcloud-account
company.name: blog.csdn.net/hello_list
management:
endpoints:
web:
exposure:
include: "*"
但是还是不可以,出来的这个
3、启动程序,因为上面出现的还是花括号,这里我用那个文章里的插件打包了下,就可以了,然后点击链接,就可以出来我们服务信息的描述,这样可以用来做我们服务信息的一个描述,在使用中查看
Eureka我们叫注册中心,就是服务的注册和发现,我们了解了服务注册,我们如何去发现服务呢,客户端如何去发现服务然后调用服务,这里我们去尝试下DiscoveryClient发现服务,调用服务就不用说了吧,Eureka基于restful我们前面使用了restful调用服务,所以在调用前我们应该去发现服务
这里我们直接拿8001再次当成客户端,我们之前不是写过一个测试controller嘛,现在就用来做客户端。
注入bean,这里我们用的是springboot框架的,别导错包了
我们新加一个方法
@GetMapping("/client/discovery") public Object discovery(){ // 这里我们模拟操作下 // 通过客户端去注册中心拿到服务信息,拿到服务信息后我们就可以restful去进行请求 // 获取微服务的列表清单 List<String> services = client.getServices(); System.out.println("service======>"+services); // 我们还可以通过服务id得到一个具体的服务信息,这里调用的自己8001端口服务 // 自己点一个下就那么几个属性 List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-ACCOUNT"); for (ServiceInstance instance : instances) { System.out.println( instance.getHost()+"\t"+ instance.getPort()+"\t"+ instance.getUri()+"\t"+ instance.getServiceId()+"\t"+ instance.getScheme()+"\t"+ instance.getMetadata() ); } return this.client; }
我们可以知道都有什么服务,服务信息是什么,这个就是我们的实例id
我们看一下都能得到什么,访问测试,我们可以拿到这些数据信息
有了这些信息,我们就可以通过restful去调用请求,然后完成远程调用,对吧,是不是很简单,其实我们发现本质还是调用请求。
特别简单,我们搭建一个三个注册中心的集群,我们再新建两个项目,其实本质就是一个项目复制粘贴,还是几步
1、导入依赖
2、编写配置
1,3步我们可以省略吧,这里我们主要看3个集群的配置,三个集群我们开三个端口7001,7002,7003,集群可简单我们看下配置就知道多简单了
这里我们为了方便和直观感受分布式,我们做一个主机映射,我这里必须管理员权限访问,这里大家就跟我一样吧,告诉大家这个方法,记事本管理员方式打开
Ctrl+o快捷键
然后在最末尾添加,这样我们访问eureka7001.com就都是在访问我们本地127.0.0.1
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
这样做一个映射非常的直观,其实也可以不用做,我们下面不是有实例名嘛,修改下,可能会有问题,还是这样做吧,因为实例名不能都是localhost,然后不是localhost就不能访问本地回环地址,打不开网页;自己尝试试试看
7001配置
server: port: 7001 # Eureka配置 eureka: instance: hostname: eureka7001.com # Eureka实例名称 client: # 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心 register-with-eureka: false fetch-registry: false service-url: #监控页面,这里改成我们自己定义的 #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
7002配置
server:
port: 7002
# Eureka配置
eureka:
instance:
hostname: eureka7002.com # Eureka实例名称
client:
# 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
register-with-eureka: false
fetch-registry: false
service-url:
#监控页面,这里改成我们自己定义的
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7003.com:7003/eureka
7003配置
server:
port: 7003
# Eureka配置
eureka:
instance:
hostname: eureka7003.com # Eureka实例名称
client:
# 是否是客户端,是否注册自己,默认都是true这里我们选择false就是自己是注册中心
register-with-eureka: false
fetch-registry: false
service-url:
#监控页面,这里改成我们自己定义的
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
3、主启动类,开启功能,把这三个都开启
我们访问eureka7001.com:7001,可以看到7002和7003的集群信息
同样的访问其他两个都是一样:
集群就搭建成功了,我们试着把8001的服务注册进去这几个注册中心,这里我们要注册三个,所以是不是应该修改下配置文件,这里做下修改就可以了
我们可以看到7002里已经把这个服务注册进来了
7001:
7003,可能是我得后台不稳定啊,不知道为什么说服务没了,可能后台服务不稳定,自我保护敏感吧,但是不影响使用
这里我们还可以把80consumer打开测试下,ok没有问题:
以下为其他原文,理论的大家可以看下:https://www.kuangstudy.com/bbs/1374942542566551554
RDBMS (MySQL\Oracle\sqlServer) ===> ACID
NoSQL (Redis\MongoDB) ===> CAP
CAP的三进二:CA、AP、CP
著名的CAP理论指出,一个分布式系统不可能同时满足C (一致性) 、A (可用性) 、P (容错性),由于分区容错性P再分布式系统中是必须要保证的,因此我们只能再A和C之间进行权衡。
Zookeeper保证的是CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接收服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但zookeeper会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30-120s,且选举期间整个zookeeper集群是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因为网络问题使得zookeeper集群失去master节点是较大概率发生的事件,虽然服务最终能够恢复,但是,漫长的选举时间导致注册长期不可用,是不可容忍的。
Eureka保证的是AP
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时,如果发现连接失败,则会自动切换至其他节点,只要有一台Eureka还在,就能保住注册服务的可用性,只不过查到的信息可能不是最新的,除此之外,Eureka还有之中自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪
都看到这里了,还不点个关注吗,bye~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。