SpringCloud(未完待续2)

文章目录

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默认负载均衡策略是轮询

发布了38 篇原创文章 · 获赞 38 · 访问量 2736

猜你喜欢

转载自blog.csdn.net/l13kddd/article/details/105128469