SpringCloud【创建服务消费者、服务自保和服务剔除机制 、服务发现Discovery、高可用Eureka注册中心、高可用Eureka注册中心搭建】(二)

 

目录

服务注册发现_创建服务消费者

服务注册发现_服务自保和服务剔除机制 

服务注册发现_actuator微服务信息完善

服务注册发现_服务发现Discovery

服务注册发现_高可用Eureka注册中心

服务注册发现_高可用Eureka注册中心搭建

客户端负载均衡_什么是负载均衡 


服务注册发现_创建服务消费者

创建cloud-consumer-order80模块 

pom文件添加依赖 

<dependencies>
        <!-- 引入Eureka client依赖   -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>

写yml文件

eureka:
 client:
    # Eureka Server地址
   service-url:
     defaultZone: http://localhost:7001/eureka
spring:
 application:
    # 设置应用名字
   name: cloud-order-consumer
server:
 port: 80

编写主启动类

/**
* 主启动类
*/
@SpringBootApplication
@EnableEurekaClient
@Slf4j
public class OrderMain80 {
    public static void main(String[] args) {
      SpringApplication.run(OrderMain80.class,args);
        log.info("*************** 订单服务消费者启动成功 ***********");
   }
}

测试

先启动EurekaServer服务,访问http://locahost:7001

 

服务注册发现_服务自保和服务剔除机制 

服务剔除,服务自保,这两套功法一邪一正,俨然就是失传多年的上乘心法的上卷和下卷。但是往往你施展了服务剔除便无法施展服务自保,而施展了服务自保,便无法施展服务剔除。也就是说,注册中心在同一时刻,只能施展一种心法,不可两种同时施展。 

服务剔除 

注意: 服务剔除把服务节点果断剔除,即使你的续约请求晚了一步也毫不留情,招式凌厉,重在当断则断,忍痛割爱。 

心法总决简明扼要: 欲练此功,必先自宫

服务自保 

注意:

服务自保把当前所有节点保留,一个都不能少,绝不放弃任何 队友。心法的指导思想是,即便主动删除,也许并不能解决问 题,且放之任之,以不变应万变。

心法总决引人深思:

宫了以后,未必成功 如果不宫,或可成功 

心法总纲 

在实际应用里,并不是所有无心跳的服务都不可用,也许因为短暂的网络抖动等原因,导致服务节点与注册中心之间续约不上,但服务节点之间的调用还是属于可用状态,这时如果强行剔除服务节点,可能会造成大范围的业务停滞。

Euraka服务自保的触发机关 

自动开关

 注意: 服务自保模式往往是为了应对短暂的网络环境问题,在理想情况下服务节点的续约成功率应该接近100%,如果突然发生网络问题,比如一部分机房无法连接到注册中心,这时候续约成功率有可能大幅降低。但考虑到Eureka采用客户端的服务发现模式,客户端手里有所有节点的地址,如果服务节点只是因为网络原因无法续约但其自身服务是可用的,那么客户端仍然可以成功发起调用请求。这样就避免了被服务剔除给错杀。

手动开关 

这是服务自保的总闸,以下配置将强制关闭服务自保,即便上面的自动开关被触发,也不能开启自保功能。

# 参数来关闭保护机制,以确保注册中心可以将不可用的实例 正确剔除,默认为true。
eureka.server.enable-self-preservation=false;

实时效果反馈

1.Eureka技术中服务自保主要应对___问题。

A 网络环境

B 单点故障

C 兼容

D 安全

2. Eureka技术中如何手动关闭服务自保的总闸____。

A eureka.server.enable-self=true;

B eureka.server.enable-self=false;

C eureka.server.enable-self-preservation=true;

D eureka.server.enable-self-preservation=false;

服务注册发现_actuator微服务信息完善

SpringCloud体系里的,服务实体向eureka注册时,注册名默认是 IP名:应用名:应用端口名。 

 

问题:

自定义服务在Eureka上的实例名怎么弄呢 

在服务提供者pom中配置Actuator依赖

<!-- actuator监控信息完善 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在服务提供者生产者application.yml中加入

eureka:                        
 instance:
    #根据需要自己起名字
   instance-id: springcloud-dept-8001   

测试

实时效果反馈

1.下列自定义服务在Eureka上的实例名正确的是____。

A eureka.instance.instance

B eureka.instance.id

C eureka.instance.instance-id

D 以上都是错误 

服务注册发现_服务发现Discovery

修改payment8001的Controller 

/**
* 支付控制层
*/
@Slf4j
@RestController
public class PaymentController {
    @Autowired
    private DiscoveryClient discoveryClient;
    @GetMapping("/payment/discovery")
    public Object discovery(){
        // 获取所有微服务信息
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            log.info("server:={}",service);
       }
        return this.discoveryClient;
   }
    
}

RestTemplate介绍

RestTemplate 是从 Spring3.0 开始支持的一个 HTTP请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、 PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。

在配置类中的restTemplate添加@LoadBalanced注解 

这个注解会 给这个组件 有负载均衡的功能

@Configuration
public class CloudConfig {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

修改payment8001工程controller

@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
    @GetMapping("/index")
    public String index(){
        return "payment + successs";
   }
}

编写order80工程Controller

@RestController
@RequestMapping("/order")
public class OrderController {
    // HTTP 请求工具
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 测试服务发现接口
     * @return
     */
    @GetMapping("/index")
    public String index(){
       //1.远程调用方法的主机
       //Stringhost="http://localhost:1000";
       //将远程微服务调用地址从"IP地址+端口号改成"微服务名称""
        String host = "http://cloud-payment-provider"
        // 2. 远程调用方法具体URL地址
        String url = "/payment/index";
        // 3. 发起远程调用
        //getForObject:返回响应体中数据转化成的对象,可以理解为json
        //getForEntity:返回的是ResponseEntity的对象包含了一些重要的信息
        String forObject = restTemplate.getForObject(host + url,String.class);
        return forObject;
   }
}

服务注册发现_高可用Eureka注册中心

在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务注册中心也一样。 

问题:

Spring-Cloud为基础的微服务架构,所有的微服务都需要注册到注册中心,如果这个注册中心阻塞或者崩了,那么整个系统都无法继续正常提供服务,所以,这里就需要对注册中心搭 建,高可用(HA)集群。 

Eureka Server的设计一开始就考虑了高可用问题,在Eureka的服务治理设计中,所有节点即是服务提供方,也是服务消费方,服务注册中心也不例外。是否还记得在单节点的配置中,我们设置过下 面这两个参数,让服务注册中心不注册自己: 

eureka.client.register-with-eureka-false

eureka.client.fetch-registry-false 

实时效果反馈

1.单机Eureka注册中心服务会出现_____问题。

A 网络环境

B 单点故障

C 兼容 

D 安全

服务注册发现_高可用Eureka注册中心搭建

构建cloud-eureka-server7002工程

修改Pom 

<dependencies>
        <!-- 服务注册发现Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

修改映射配置

找到C:\Windows\System32\drivers\etc\hosts

#添加如下配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

修改7001YML文件

#修改7001主机yml文件
server:
 port: 7001
eureka:
 instance:
    # eureka服务端的实例名字
   hostname: eureka7001.com
 client:
    #表 示是否将自己注册到Eureka Server
   register-with-eureka: false
    # 表示是否从Eureka Server获取注册的服务信息
   fetch-registry: false
    # 设置与 Eureka server交互的地址查询服务和注册服务都需要依赖这个地址
   service-url:
     defaultZone: http://eureka7002.com:7002/eureka/

修改7002YML文件

#修改7001主机yml文件
server:
 port: 7002
eureka:
 instance:
    # eureka服务端的实例名字
   hostname: eureka7002.com
 client:
    #表 示是否将自己注册到Eureka Server
   register-with-eureka: false
    # 表示是否从Eureka Server获取注册的服务信息
   fetch-registry: false
    # 设置与 Eureka server交互的地址查询服务和注册服务都需要依赖这个地址
   service-url:
     defaultZone: http://eureka7001.com:7001/eureka/

编写主启动类

/**
* 主启动类
*/
@Slf4j
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
    public static void main(String[] args) {
       SpringApplication.run(EurekaMain7002.class,args);
        log.info("*************** Eureka 服务启动成功 ***********");
   }
}

将支付微服务8001发布到Eureka集群上

eureka:
 client:
   service-url:
     defaultZone:http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

将订单微服务80发布到Eureka集群上

eureka:
 client:
   service-url:
     defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

测试

1 先启动EurekaServer集群

2 在启动服务提供者provider服务

3 在启动消费者服务

 

客户端负载均衡_什么是负载均衡 

为什么需要负载均衡 

俗话说在生产队薅羊毛不能逮着一只羊薅,在微服务领域也是这个道理。面对一个庞大的微服务集群,如果你每次发起服务调用都只 盯着那一两台服务器,在大用户访问量的情况下,这几台被薅羊毛的服务器一定会不堪重负。

负载均衡要干什么事情 

负载均衡有两大门派,服务端负载均衡客户端负载均衡。我们先来聊聊这两个不同门派的使用场景,再来看看本节课的主角Spring Cloud Loadbalancer 属于哪门哪派。

服务端负载均衡 

在服务集群内设置一个中心化负载均衡器,比如Nginx。发起服务间调用的时候,服务请求并不直接发向目标服务器,而是发给这个全局负载均衡器,它再根据配置的负载均衡策略将请求转发到目标服务。

 

优点:

1、服务端负载均衡应用范围非常广,它不依赖于服务发现技术,客户端并不需要拉取完整的服 务列表;同时,发起服务调用的客户端也不用操心该使用什么负载均衡策略。

劣势:

1、网络消耗

2、复杂度和故障率提升 

 Spring Cloud Loadbalancer 可以很好地弥补上面的劣势,那么它是如何做到的呢?

客户端负载均衡 

Spring Cloud Loadbalancer 采用了客户端负载均衡技术,每个发起服务调用的客户端都存有完整的目标服务地址列表,根据配置的负载均衡策略,由客户端自己决定向哪台服务器发起调用。

 

 

优势:

1、网络开销小

2、配置灵活

劣势:

需要满足⼀个前置条件,发起服务调用的客户端需要获取所有目标服务的地址,这样它才能使用负载均衡规则选取要调用的服务。也就是说,客户端负载均衡技术往往需要依赖服务发现技术来获取服务列表。 

负载均衡需要解决两个最基本的问题: 

第一个是从哪里选服务实例

在Spring Cloud的Eureka微服务系统中,维护微服务实例清单的是 Eureka服务治理中心,而具体微服务实例会执行服务获取,获得微服务实例清单,缓存到本地,同时,还会按照一个时间间隔更新这份实例清单(因为实例清单也是在不断维护和变化的)。

第二个是如何选择服务实例 

通过过负载均衡的策略从服务实例清单列表中选择具体实例。

注意: Eurka和Loadbalancer 自然而然地到了一起,一个通过服务发现获取服务列表,

另一个使用负载均衡规则选出目标服务器,然后过着没羞没躁的生活。

什么是Spring Cloud Ribbon 

Spring Cloud Ribbon是NetFlix发布的负载均衡器,它有助于Http和Tcp的客户端行为。可以根据负载均衡算法(轮询、随机或自定义)自动帮助消费者请求,默认就是轮询。

问题:

状态 - 停更进维

替代方案 - Spring Cloud Loadbalancer 

什么是Spring Cloud LoadBalancer 

但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1 相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容,就算你的项目中继续用 Spring Cloud Netflix 套装(包括Ribbon,Eureka,Zuul,Hystrix等等)让你的项目中有这些依赖,你也可以通过简单的配置,把Ribbon替换成Spring Cloud LoadBalancer。

实时效果反馈

1.Spring Cloud Ribbon是NetFlix发布的____。

A 网络环境

B 单点故障

C 负载均衡器

D 安全

2.Spring Cloud Ribbon替代方案是_____。

A Spring Cloud LoadBalancer 

B Spring Cloud Eureka

C Spring Cloud OpenFeign

D Spring Cloud Gateway

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131871740