文章目录
- 5.3利用Eureka做服务注册中心。
- 5.4.回顾CAP原则
- 6.ribbon
5.3利用Eureka做服务注册中心。
1.创建springcloud-eureka-7001模块
项目结构:
2.导入依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.muzi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-eureka-7001</artifactId>
<!--导包-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
3.配置application.yml
server:
port: 7001
#Eureka配置
eureka:
instance:
#Eureka服务端的名字
a-s-g-name: localhost
client:
#表示是否向Eureka注册中心注册自己
register-with-eureka: false
#fetch-registry如果为false,则表示自己为注册中心
fetch-registry: false
#监控页面
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.建EurekaServer_7001启动类
//启动之后访问http://loaclhost:7001
@SpringBootApplication
//EnableEurekaServer是个服务端的启动类,可以接受别人注册进来
@EnableEurekaServer
public class EurekaServer_7001 {
public static void main(String[] args){
SpringApplication.run(EurekaServer_7001.class,args);
}
}
5.启动之后访问http://loaclhost:7001
6.在服务提供者的项目中导入Eureka的依赖
<!--Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
7.在服务提供者的yml中配置Eureka的url
#Eureka配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
8.在服务提供者的启动类上开启Eureka功能
//在服务启动后自动注册到Eureka中
@EnableEurekaClient
9.可以修改注册中心页面对服务提供者的默认描述Status(选)
即:
在服务提供者的yml中添加配置:
更改后可显示到Status中
【注意】:若在服务启动时,突然停止服务提供者的启动,则会出现
这是Eureka的自我保护机制
10.完善监控信息(选)
(1).在服务提供者的pom中添加actuator依赖
<!--actuator完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2).在服务提供者的yml中添加
#info配置
info:
app.name: muzi-springcloud
company.name: blog.muzistudy.com
重启服务后,
点击:
跳转:
11.服务发现(获得注册在服务中心的微服务的信息)
(1).在服务提供者的Controller类中添加
import org.springframework.cloud.client.discovery.DiscoveryClient;
@Autowired
private DiscoveryClient client;
//注册进来的微服务,获取一些消息
@GetMapping("/dept/discovery")
public Object discovery(){
//获取微服务列表的清单
List<String> services = client.getServices();
System.out.println("discovery=>services"+services);
//得到一个具体的微服务信息,通过具体的微服务ID:applicationName
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
for(ServiceInstance instance:instances){
System.out.println(
instance.getHost()+"\t"+
instance.getPort()+"\t"+
instance.getUri()+"\t"+
instance.getInstanceId()
);
}
return this.client;
}
(2).在服务提供者的启动类上添加
//服务发现
@EnableDiscoveryClient
(3).重启服务进行get访问
12.集群环境配置
(1).创建springcloud-eurea-7002和springcloud-eurea-7003两个服务
并进行与springcloud-eureka-7001一样的配置(导包,配置,启动类)
(2).改变本地域名(例:localhost=eureka7001.com)
(3).在每个服务中心的yml进行集群配置:
在服务中心7001的yml下,
#Eureka服务端的名字
a-s-g-name: eureka7001.com
#单机defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群(关联):#绑定7002,#绑定7003
defaultZone: http://eureka7002.com:7002/eureka/, http://eureka7003.com:7003/eureka/
在服务中心7002的yml下,
#Eureka服务端的名字
a-s-g-name: eureka7002.com
#集群(关联):#绑定7001,#绑定7003
defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7003.com:7003/eureka/
在服务中心7003的yml下,
#Eureka服务端的名字
a-s-g-name: eureka7003.com
#集群(关联):#绑定7001,#绑定7002
defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/
启动三个服务中心,并进行访问:
显示已集群
(4).在服务提供者的yml中的eureka配置下,
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
启动服务提供者:
在三个服务中心都存在服务提供者的注册
5.4.回顾CAP原则
RDBMS(Mysql、Oracle、sqlServer)===>ACID
NoSQL(redis、mongdb)===>CAP
ACID是什么?
原子性,一致性,隔离性,持久性
CAP是什么?
强一致性,可用性,分区容错性
CAP理论的核心:
○一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求。
○根据CAP原则,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类。
○CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差。
○CP:满足一致性,分区容错性的系统,通常性能不是特别高。
○AP:满足可用性,分区容错性的系统,通常可能对一致性要求低一些。
作为服务注册中心,Eureka比Zookeeper好在哪里?
由于分区容错性P在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡。
○Zookeeper保证的是CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务down掉不可用。也就是说,服务注册功能对可用性的要求高于一致性。但是zk会出现这样一种情况,当mater节点因为网络故障与其他节点时区联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30-120s,且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因为网络问题使得zk集群失去master节点是较大概率会发生的事件,虽然服务最终能够恢复,但漫长的选举时间导致的注册长期不可用是不能容忍的。
○Eureka保证的是AP
Eureka看明白这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端子向某个Eureka注册时,如果发现连接失败,则会自动切换至其他节点,只要有一台Eureka还在,就能保证注册服务的可用性,只不过查到的信息不是最新的,除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%个节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
1.Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2.Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点依然可用)
3.当网络稳定时,当前实例新的注册信息会被同步到其他节点。
因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样导致整个注册服务瘫痪
6.ribbon
6.1、ribbon是什么?
○Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
○简单来说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项如:连接超时、重试等等。简单来说,就是在配置问价中列出LoadBalancer(LB:负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等等)去连接这些机器。我们也容易使用Ribbon实现自定义的负载均衡算法。
默认负载均衡算法是轮询。
6.2、Ribbon能干嘛?
○LB,即负载均衡,在微服务或分布式集群中经常用的一种应用。
○负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
○常见的负载均衡软件有Nginx,Lvs等等。
○dubbo、SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义
○负载均衡简单分类:
○集中式LB
○即在服务的消费方和提供方之间使用独立的设备,如Nginx,由该设施负责把访问请求通过某种策略转发到服务的提供方。
○进程式LB
○将LB逻辑集成到消费方,消费方从服务中心获知有哪些地址可用,然后自己在从这些地址中选出一个合适的服务器。
○Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获知服务提供方的地址。
6.3、使用Ribbon(与Eureka整合)初步体现负载均衡
1.在消费者的pom中导Ribbon及Eureka依赖
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2.在消费者的yml中进行eureka的配置
#Eureka配置
eureka:
client:
#不向Eureka服务注册中心注册自己
register-with-eureka: false
service-url:
#在这三个注册中心获取
defaultZone: http://eureka7001.com:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
3.在消费者的启动类中开启Eureka,故添加@EnableEurekaClient注解
4.在config包下的ConfigBean类中的RestTemplate方法上配置负载均衡
@Bean
//配置负载均衡实现RestTemplate
@LoadBalanced//Ribbon
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
5.改变消费者Controller里的地址常量
//Ribbon 我们这里的地址,应该是一个变量,通过服务名来访问
//private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
Ribbon和Eureka整合以后,客户端可以直接调用,不用关心IP地址和端口号。
6.4、加大负载均衡的体现
原理:
1.创建跟db01相同的两个数据库db02,db03
2.在创建2个服务提供者,复制提供者8001的即可。
并分别连接三个不同数据库
3.启动三个服务注册中心,三个服务提供者,一个消费者。
此处不演示,电脑已崩。无16g,别尝试!!!
ribbon默认负载均衡策略是轮询