SpringCloud Eureka-服务注册与发现02

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

3.1为什么需要集群EurekaServer?

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

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

3.2.4完成测试

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


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的监控页面中都注册了上述微服务:


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

同样的,为了高可用性,我们不仅在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中可以看到注册列表中只有一个服务提供名,但是它包含了两个远程调用的接口:

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

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

(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中打印当前的服务提供方的名称

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

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

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

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

    第一次访问:

第二次访问:

交替访问member服务说明:

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

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)修改启动类,添加注解启用服务发现

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

day05-SpringCloud Eureka-服务注册与发现02的更多相关文章

  1. 将SpringCloud Eureka 服务注册与发现部署到docker

    一.前言 最近在学习docker,顺便把之前学习的spring cloud 部署到Docker 中.至于什么是SpringCloud的服务注册与发现,什么是docker,我这里就不作赘述了.可以先去学 ...

  2. SpringCloud Eureka服务注册及发现——服务端/客户端/消费者搭建

    Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分为 Eureka Serv ...

  3. springcloud(第三篇)springcloud eureka 服务注册与发现 *****

    http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...

  4. SpringCloud——Eureka服务注册和发现

    一.SpringCloud和Dubbo SpringCloud整合了一套较为完整的微服务解决方案框架,而Dubbo只是解决了微服务的几个方面的问题. content Dubbo SpringCloud ...

  5. SpringCloud(3)---Eureka服务注册与发现

    Eureka服务注册与发现 一.Eureka概述 1.Eureka特点 (1) Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. (2) Eureka 主管服务 ...

  6. SpringCloud 进阶之Eureka(服务注册和发现)

    1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册 ...

  7. SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门

    1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...

  8. SpringCloud - 2. 服务注册 和 发现

    SpringCloud 的服务注册和发现是由Eureka来完成. 1.eureka server 1.1 依赖 <dependency> <groupId>org.spring ...

  9. Spring Cloud学习(一):Eureka服务注册与发现

    1.Eureka是什么 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的. Eureka ...

  10. Eureka服务注册与发现

    一.服务注册 注册Eureka的服务非常的简单,只需要引入spring-cloud-starter-netflix-eureka-client的jar包即可. <dependency> & ...

随机推荐

  1. 当前SAT主要关键技术及其相关文献2022-11-1

    摘录自: Tasniem Nasser Al-Yahya, Mohamed El Bachir Menai, Hassan Mathkour:Boosting the Performance of C ...

  2. spark命令

    spark提交任务命令 集群方式: ./bin/spark-submit  --master spark://localhost:7077 --class 类 /home/cjj/testfile/f ...

  3. linux which及软硬链接使用

    which查看系统命令位置,which vi /bin #放置系统一般命令 /sbin#放置系统管理相关命令 /user/bin /user/sbin 软链接 ln -s 源文件 链接文件 #1.如果 ...

  4. 12.7 linux学习第十四天

    今天老刘开始讲第10章,主要讲Ahache服务和SELinux安全子系统 10.1 网站服务程序 1970年,作为互联网前身的ARPANET(阿帕网)已初具雏形,并开始向非军用部门开放,许多大学和商业 ...

  5. php 解密 java des 密文

    背景 对方系统java des 加密, 我们用 php 解密 模式基本介绍 ECB模式:电子密本方式,JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节 ...

  6. javaheima14

    Java 日志框架 日志框架的概述 记录程序运行过程中的信息,并可以进行永久存储 以前记录日志的方式--输出语句 弊端 信息只能展示在控制台 不能将其记录到其他位置(文件,数据库) 想取消记录的信息需 ...

  7. idea的tomcat控制台输出乱码

    tomcat乱码问题 idea的tomcat控制台输出乱码 找到自己的安装目录 用vscode打开 ctrl+f打开搜索 输入encoding 最后一个是用来给idea中的控制台输出 --->改 ...

  8. CentOS7-mysql5.7.35安装配置

    一.下载网址 注:mysql从5.7的某个版本之后之后不再提供my-default.cnf文件,不耽误启动,想要自定义配置可以自己去/etc下创建my.cnf文件 全版本:https://downlo ...

  9. 《Unix/Linux系统编程》第十一周学习笔记

    <Unix/Linux系统编程>第十一周学习笔记 TCP/IP协议 TCP/IP 是互联网的基础.TCP代表传输控制协议.IP代表互联网协议.目前有两个版本的IP,即IPv4和IPv6.I ...

  10. Qt使用API实现鼠标点击操作

    前段时间,工作需要进行数据录入,每次都要点击3次按钮,想让鼠标自行点击,只要下位机接入,就自动点击按钮把数据读出,录入到服务端,并且进行检测,说干就干,没有经验,那只有面向百度编程. 根据查到的资料, ...