首页 > 其他分享 >day05-SpringCloud Eureka-服务注册与发现02

day05-SpringCloud Eureka-服务注册与发现02

时间:2023-04-07 20:01:47浏览次数:45  
标签:02 服务 service SpringCloud day05 member EurekaServer 注册 集群

SpringCloud Eureka-服务注册与发现02

3.搭建EurekaServer集群-实现负载均衡&故障容错

3.1为什么需要集群EurekaServer?

  1. 微服务RPC远程服务调用最核心的是高可用
  2. 如果注册中心只有1个,如果出现故障,会导致整个服务环境不可用
  3. 解决办法就是搭建Eureka注册中心集群,实现负载均衡和故障容错(构成集群的几个主机之间的提供的服务是相同的)
image-20230407164432016

3.2搭建EurekaServer集群

3.2.1搭建第二个注册中心

搭建 e-commerce-eureka-server-9002 微服务模块,作为第二个 EurekaServer -注册中心。

搭建的具体步骤和 e-commerce-eureka-server-9001 一样,见上篇2.2

(1)创建Module,在pom.xml加入相关依赖(略)

(2)创建配置文件application.yml

server:
  port: 9002

#配置Eureka-server
eureka:
  instance:
    hostname: eureka9002.com #服务实例名
  client: #如果Eureka是一个集群,那么相互两个EurekaServer之间也可以当做对方为客户端
    #配置是否向注册中心注册自己
    register-with-eureka: false
    #表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
    fetch-registry: false
    service-url:
      #当前的注册中心 需要注册到 Eureka9001 注册中心
      defaultZone: http://eureka9001.com:9001/eureka/

(3)创建主启动类

package com.li.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author 李
 * @version 1.0
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication9002 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication9002.class,args);
    }
}

3.2.2修改第一个注册中心

(1)修改 e-commerce-eureka-server-9001 的 application.yml 文件

server:
  port: 9001

#配置Eureka-server
eureka:
  instance:
    hostname: eureka9001.com #服务实例名
  client: #如果Eureka是一个集群,那么相互两个EurekaServer之间也可以当做对方为客户端
    #配置是否向注册中心注册自己
    register-with-eureka: false
    #表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
    fetch-registry: false
    service-url: #设置于 Eureka server 的交互模块,查询服务和注册服务都需要依赖这个地址
      #EurekaServer之间相互注册
      defaultZone: http://eureka9002.com:9002/eureka/

(2)将e-commerce-eureka-server-9001的主启动类的名称修改为 EurekaApplication9001

3.2.3修改host文件

因为是在一台电脑上模拟的集群,为了浏览器输入类似eureka9002.com:9002/eureka/的地址,可以直接访问到,这里修改host文件,对上述指定域名进行本机的ip映射。

文件位置:C:\Windows\System32\drivers\etc\hosts

image-20230407172132803

3.2.4完成测试

分别启动两个注册中心,在浏览器中访问上图配置的地址:

image-20230407172715789 image-20230407172750982

3.3.5将其他微服务注册到EurekaServer集群

(1)将member-service-provider-10000注册到 EurekaServer 集群

部分配置:

eureka:
    service-url:
      #将本微服务注册到多个EurekaServer,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

(2)将member-service-consumer-80注册到 EurekaServer 集群:同上,修改位置相同(略)。

(3)启动这些微服务,可以看到在所有EurekaServer的监控页面中都注册了上述微服务:

image-20230407173832437 image-20230407173804365

3.3搭建会员中心服务提供方集群

image-20230407174008235

同样的,为了高可用性,我们不仅在EurekaServer中要使用集群,在服务提供方也要使用集群(构成集群的几个主机之间的提供的服务是相同的)。

3.3.1搭建第二个服务提供方

所以参考 member-service-provider-10000 的代码来创建 member-service-provider-10002 ,以下简称为10000 和 10002

(1)创建Module-member-service-provider-10002

(2)可以将磁盘下10000子模块的main目录复制替换10002的main目录

(3)然后在10002的pom.xml中导入和10000的pom.xml相同的依赖

(4)最后修改10002的端口和当前应用的名称,并修改10002的主程序名称。

(5)测试

3.3.2注意事项和细节

因为member-service-provider-10000和member-service-provider-10002是作为一个集群对外提供服务的,因为我们需要将两个微服务的spring.application.name进行统一,这样消费方可以通过统一的别名进行负载均衡调用。

spring:
  application:
    name: member-service-provider #同一将服务提供方的应用名设置为member-service-provider

设置后,重新启动服务启动方,在EurekaServer中可以看到注册列表中只有一个服务提供名,但是它包含了两个远程调用的接口:

image-20230407181615174

3.4配置服务消费端使用会员中心服务集群

配置服务消费端 member-service-consumer-80,让它可以使用会员中心服务集群。

image-20230407181931966

(1)修改MemberConsumerController.java

package com.li.springcloud.controller;

import ...

/**
 * @author 李
 * @version 1.0
 */
@RestController
@Slf4j
public class MemberConsumerController {
    @Resource
    private RestTemplate restTemplate;

    /**
     * 1.MEMBER-SERVICE-PROVIDER 是服务提供方[集群]注册到EurekaServer的别名
     * 2.也是服务提供方[集群]对方暴露的名称
     * 3.这里MEMBER-SERVICE-PROVIDER 目前有两个可以获取的区域:
     *   member-service-provider-10000、member-service-provider-10002
     */
    public static final String MEMBER_SERVICE_PROVIDER_URL =
            "http://MEMBER-SERVICE-PROVIDER";//改为提供服务模块的别名

    //添加对象到数据库表中
    @PostMapping("/member/consumer/save")
    public Result<Member> save(Member member) {
        return restTemplate.postForObject
                (MEMBER_SERVICE_PROVIDER_URL + "/member/save",
                        member,
                        Result.class);
    }
    
    //根据id调用服务接口,返回member对象信息
    @GetMapping("/member/consumer/get/{id}")
    public Result<Member> getMemberById(@PathVariable("id") Integer id) {
        return restTemplate.getForObject
                (MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id,
                        Result.class);
    } 
}

(2)修改 CustomInitBean.java

需要增加注解 @LoadBalanced,赋予 RestTemplate负载均衡能力,即选择 MEMBER-SERVICE-PROVIDER 某一个服务访问,默认是轮询算法

package com.li.springcloud.config;

import ...

/**
 * @author 李
 * @version 1.0
 * 注入RestTemplate Bean
 */
@Configuration
public class CustomInitBean {
    @Bean
    @LoadBalanced //赋予RestTemplate负载均衡的能力,默认是使用轮询算法来访问远程调用接口
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

(3)依次启动EurekaServer集群、服务提供方集群、服务消费方

为了区分,可以在服务提供方的Controller中打印当前的服务提供方的名称

  • 先用浏览器直接访问服务提供方集群的接口,目的是测试服务提供方是否正常工作:

    注意这里访问的分别是不同的服务提供方的接口

image-20230407190344941 image-20230407190442803

  • 在用浏览器访问服务消费方的接口,测试服务消费方是否正常工作:

    可以看到浏览器访问同一个地址(即只有一个服务消费方模块),但是底层调用的服务提供方是不一样的(轮询访问)

    第一次访问:

    image-20230407191317039

第二次访问:

image-20230407191223485

交替访问member服务说明:

  1. 注解 @LoadBalanced底层是Ribbon支持算法
  2. Ribbon和Eureka整合后,服务消费方可以直接调用服务,而不用再关心服务提供方的地址和端口号
  3. 该服务还有负载功能
image-20230407192321911

3.5通过DiscoveryClient获取EurekaServer服务注册信息

无论是服务消费方还是服务提供方,它们都是EurekaClient。如果希望获取到EurekaServer的服务注册信息,可以使用DiscoveryClient。

这里以服务消费方为例,获取EurekaServer的服务注册信息:

(1)修改 MemberConsumerController.java

package com.li.springcloud.controller;

import ...

/**
 * @author 李
 * @version 1.0
 */
@RestController
@Slf4j
public class MemberConsumerController {
    @Resource
    private RestTemplate restTemplate;

    //装配一个DiscoveryClient,
    //注意用的包是 import org.springframework.cloud.client.discovery.DiscoveryClient;
    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/member/consumer/discovery")
    public Object discovery() {
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            log.info("服务名={}", service);
            //通过服务名来获取服务名对应的实例
            List<ServiceInstance> instances = discoveryClient.getInstances(service);
            for (ServiceInstance instance : instances) {
                log.info("id={},host={},port={},uri={}",
                        instance.getServiceId(), instance.getHost(), 
                         instance.getPort(), instance.getUri());
            }
        }
        return discoveryClient;
    }
    
    //其他方法略..
}

(2)修改启动类,添加注解启用服务发现

image-20230407194213745

(3)重启服务消费模块,浏览器访问 http://localhost/member/consumer/discovery,后台输出如下:

image-20230407194614040

标签:02,服务,service,SpringCloud,day05,member,EurekaServer,注册,集群
From: https://www.cnblogs.com/liyuelian/p/17297197.html

相关文章

  • 2023 年值得关注的7个SaaS趋势
    软件即服务(SaaS)在过去十几年中逐渐走向主流,SaaS在越来越多的行业中取代本地部署系统,提供尖端的解决方案。SaaS产品之间也越来越卷,竞争加剧,客户的期望也越来越高。 PriceIntelligently最近发布的一项研究表明,2015年投放市场的SaaS产品平均有2.6个竞争对手。五年后,这个......
  • # システムに関して知識の復習は始まります20230407
    システムに関して知識の復習は始まります20230407今回、Markdowmで要点をメモしておくつもり、まずMarkdownの学んだ方法は以下です。1タイトル:二級タイトル三級タイトル四級タイトル2字体=フォントfont"Hello,World!"Hello,World!"cm+i斜体;"Hello,World!"cm+b太字;......
  • 2022 CCPC 绵阳站
    2022CCPCMianyangCF传送门简记情况是就柿火红猕猴果队的第一次训练赛!大概做了三个小时,过了CGH,卡在AM。C直接做,G直接模拟,H构造。5题是银or铜。A.BanorPick,What'stheTrick记忆化搜索/动态规划Solution思路注意到,每次pick或ban都应该选择己方or对方分数最......
  • 群晖DS920+网络附属存储服务器NAS部署示意图图示2023年4月7日
          群晖DS920+网络附属存储服务器NAS部署示意图图示2023年4月7日  ......
  • 【2023-04-05】连岳摘抄
    23:59春事阑珊芳草歇。客里风光,又过清明节。小院黄昏人忆别。落红处处闻啼鴂。咫尺江山分楚越。目断魂销,应是音尘绝。梦破五更心欲折。角声吹落梅花月。                                      ......
  • 【2023-04-04】二瓜出洞
    20:00人作事极不可迂滞,不可反复,不可烦碎;代人作事又极要耐得迂滞,耐得反复,耐得烦碎。                                                 ——林逋现在二宝爬得好溜了。此......
  • 邮箱密码-2020模拟
    【题目描述】小明的电子邮箱密码忘记了。请你帮他找出密码。他零星记得密码的信息如下:1)密码是六位数字,前面两位是31;2)最后两位数字相同;3)能被16和46整除;请你找出所有可能的密码并统计个数。【评分标准】30分︰正确打印出一组符合的六位数(程序不报错);80分∶在满足30基础......
  • 输出偶数-2020真题
    【题目描述】输入一个正整数(N),将1-N之间的偶数输出。输入样例:(以下提示信息是程序输出内容)输入一个正整数(N):10输出样例:2468评分标准6分:能正确输出一组数据6分:能正确输出两组数据6分:能正确输出三组数据n=int(input())foriinrange(2,......
  • 安装wsl的必备操作——开启CPU虚拟化——WslRegisterDistribution failed with error_
    参考:https://www.cnblogs.com/smdtxz/p/16837946.htmlhttps://www.cnblogs.com/wenonly/p/17206040.htmlhttps://blog.csdn.net/qq_41460654/article/details/118026986  ======================================================  因为实验室需要炼丹,而炼丹要用ubun......
  • 数组学习20230407
    今日学习数组:上节课背点:1.三角图输出:上改条件下改值2.外循环控制行,内循环控制列01变量一个数据数组多个同类数据数组/array相同类型数据的组合数组的声明:1.数据类型[]数组名intarr1=newint[]{元素,元素,元素}2.数组类型数组名[]......