(六)、集群Eureka构建

简介: (六)、集群Eureka构建

EureKa集群说明

服务注册:将服务信息注册进注册中心

服务发现:从注册中心上获取服务信息

实质:存key服务命取value闭用地址

1先启动eureka注主册中心

2启动服务提供者payment支付服务

3支付服务启动后会把自身信息(比服务地址L以别名方式注朋进eureka

4消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址

5消去者导调用地址后,底屋实际是利用HttpClient技术实现远程调用

6消费者实癸导服务地址后会缓存在本地jvm内存中,默认每间隔30秒更新—次服务调用地址

问题:微服务RPC远程服务调用最核心的是什么

高可用,试想你的注册中心只有一个only one,万一它出故障了,会导致整个为服务环境不可用。

Eureka集群环境构建

1.创建一个Module:cloud-eureka-server7002参考新建的7001

2.找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改映射配置添加进hosts文件,为避免重名

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

3.修改cloud-eureka-server7001配置文件

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://eureka7002.com:7002/eureka/
      #单机就是7001自己
      #defaultZone: http://eureka7001.com:7001/eureka/

4.修改cloud-eureka-server7002配置文件

server:
  port: 7002
eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://eureka7001.com:7001/eureka/
      #单机就是7002自己
      #defaultZone: http://eureka7002.com:7002/eureka/

5.测试

相互注册,相互守望

访问Eureka (eureka7002.com),指向7001

访问Eureka (eureka7001.com),指向7002

订单支付两个微服务入驻Eureka集群

将支付服务8001微服务,订单服务80微服务发布到上面2台Eureka集群配置中

对两个工程的配置文件的eureka.client.service-url.defaultZone进行修改

eureka:
  client:
    #表示是否将自己注册进Eurekaserver默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

测试

  1. 先要启动EurekaServer,7001/7002服务
  2. 再要启动服务提供者provider,8001
  3. 再要启动消费者,80
  4. 浏览器输入 - http://localhost/consumer/payment/get/1

支付微服务集群配置

支付服务提供者8001集群环境构建参考cloud-provicer-payment8001

1.新建cloud-provider-payment8002

2.配置pom

3.写YML

4.主启动类

5.业务类

6.修改8001/8002的Controller,添加serverPort

@RestController
@Slf4j
public class PaymentController{
    @Value("${server.port}")
    private String serverPort;//添加serverPort
    @PostMapping(value = "/payment/create")
    public CommonResult create(@RequestBody Payment payment)
    {
        int result = paymentService.create(payment);
        log.info("*****插入结果:" + result);
        if(result > 0) {
            return new CommonResult(200,"插入数据库成功,serverPort: "+serverPort/*添加到此处*/, result);
        }else{
            return new CommonResult(444,"插入数据库失败",null);
        }
    }
}

之前单机版写死了,一直就是8001端口的那个服务,现在两个服务,需要均衡分配

负载均衡

cloud-consumer-order80订单服务访问地址不能写死

@Slf4j
@RestController
public class OrderController {
    //public static final String PAYMENT_URL = "http://localhost:8001";
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    ...
}

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced//使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

测试

先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001/8002服务

浏览器输入 - http://localhost/consumer/payment/get/31

结果:负载均衡效果达到,8001/8002端口交替出现

Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能。

访问:localhost/consumer/payment/get/1

负载均衡效果达到,8001、8002端口交替出现

注意:

Web server failed to start. Port 8002 was already in use.端口被占用

There was an unexpected error (type=Internal Server Error, status=500).
500 : [{"timestamp":"2021-09-11T10:06:45.594+0000","status":500,"error":"Internal Server Error","message":"Invalid bound statement (not found): com.ylc.cloud.dao.PaymentDao.getPaymentById","trace":"org.apach... (6468 bytes)]
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 : [{"timestamp":"2021-09-11T10:06:45.594+0000","status":500,"error":"Internal Server Error","message":"Invalid bound statement (not found): com.ylc.cloud.dao.PaymentDao.getPaymentById","trace":"org.apach... (6468 bytes)]

Invalid bound statement (not found): com.ylc.cloud.dao.PaymentDao.getPaymentById,这个是mapper.xml里面的类,命名空间错误

Actuator微服务信息完善

主机名称的修改

修改cloud-provider-payment8001,cloud-provider-payment8002

服务名称的完善

修改部分 - YML - eureka.instance.instance-id

eureka主页将显示payment8001,payment8002代替原来显示的IP地址

访问信息有IP信息提示

就是将鼠标指针移至payment8001,payment8002名下,会有IP地址提示

修改部分 - YML - eureka.instance.prefer-ip-address

eureka:
  ...
  instance:
    instance-id: payment8001 
    prefer-ip-address: true #添加此处
eureka:
  ...
  instance:
    instance-id: payment8002 
    prefer-ip-address: true #添加此处

服务发现Discovery

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

  • 修改cloud-provider-payment8001的Controller
import org.springframework.cloud.client.discovery.DiscoveryClient;
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/payment/discovery")
    public Object discovery()
    {
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            log.info("*****element: "+element);
        }
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }
        return this.discoveryClient;
    }

主启动类增加注解

@EnableDiscoveryClient//添加该注解

自测

先要启动EurekaSeryer

再启动8001主启动类,需要稍等一会儿

浏览器输入http://localhost:8001/payment/discovery

浏览器输出:

{"services":["cloud-payment-service"],"order":0}

后台输出:

*****element: cloud-payment-service


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
消息中间件 Java 开发工具
Spring Cloud【Finchley】实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置
Spring Cloud【Finchley】实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置
640 0
|
存储 负载均衡 微服务
Consul 架构简介
Consul 架构简介
737 0
Consul 架构简介
剑指Offer第二版PDF+源码
剑指Offer第二版PDF+源码
1125 0
|
Java 开发者 微服务
Eureka 集群配置|学习笔记
快速学习 Eureka 集群配置
Eureka 集群配置|学习笔记
|
开发框架 Prometheus 监控
SpringCloud微服务实战——搭建企业级开发框架(四十四):【微服务监控告警实现方式一】使用Actuator + Spring Boot Admin实现简单的微服务监控告警系统
 业务系统正常运行的稳定性十分重要,作为SpringBoot的四大核心之一,Actuator让你时刻探知SpringBoot服务运行状态信息,是保障系统正常运行必不可少的组件。 spring-boot-starter-actuator提供的是一系列HTTP或者JMX监控端点,通过监控端点我们可以获取到系统的运行统计信息,同时,我们可以自己选择开启需要的监控端点,也可以自定义扩展监控端点。 Actuator通过端点对外暴露的监控信息是JSON格式数据,我们需要使用界面来展示,目前使用比较多的就是Spring Boot Admin或者Prometheus + Grafana的方式
2064 57
|
NoSQL Redis
使用slowapi对FastApi的接口进行限速
使用slowapi对FastApi的接口进行限速
3433 0
|
存储 监控 关系型数据库
快速将大规模MySQL数据同步到Doris的方法解析
NineData 采用先进的数据同步技术,确保数据实时同步到 Doris,极大地降低了数据延迟,实测 500 GB 数据传输完成仅用时 40 分钟,让您的决策基于最新数据。
2268 0
|
SQL 分布式计算 关系型数据库
Apache doris Datax DorisWriter扩展使用方法
DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能
1597 1
Apache doris Datax DorisWriter扩展使用方法
|
SQL 存储 数据可视化
【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage
【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage
1821 57