(六)、集群Eureka构建

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: (六)、集群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


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
8月前
|
Oracle 关系型数据库 Shell
Nacos部署问题之多节点集群报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
744 16
|
缓存 监控 负载均衡
SpringCloud极简入门-Eureka集群&Eureka调优
当微服务数量达到上百之数,一个EurekaServer所需要承担的压力会比较大,加上单节点故障问题可能会导致整个微服务不可被访问,由于EurekaServer在微服务中举足轻重,我们需要考虑对EurekaServer做高可用集群。
401 0
|
Dubbo 应用服务中间件 开发工具
以zookeeper作为注册中心的分布式服务框架dubbo的部署安装
以zookeeper作为注册中心的分布式服务框架dubbo的部署安装
|
5月前
|
Kubernetes 关系型数据库 MySQL
k8s部署nacos集群
k8s部署nacos集群
|
6月前
|
监控 数据库连接 Nacos
Nacos 集群部署过程中,常见的问题
Nacos 集群部署过程中,常见的问题
|
8月前
|
Linux Nacos 数据库
【微服务】生产部署nacos集群(三个节点)
【微服务】生产部署nacos集群(三个节点)
218 1
|
8月前
|
负载均衡 Java Maven
SpringCloud - Eureka服务注册与发现实战(单节点与集群)
SpringCloud - Eureka服务注册与发现实战(单节点与集群)
111 0
|
Cloud Native 关系型数据库 MySQL
Nacos 介绍及搭建集群、相关组件
Nacos 介绍及搭建集群、相关组件
767 0
|
负载均衡 微服务 Windows
SpringCloud学习(五):微服务注册进eureka集群
试想:如果注册中心只有一个eureka服务,假如它出故障了,会导致整个为服务环境不可用。 所以,为了实现高可用,我们需要搭建Eureka注册中心集群 ,实现负载均衡+故障容错
144 0
SpringCloud学习(五):微服务注册进eureka集群
|
Java 开发者 微服务
Eureka 集群配置|学习笔记
快速学习 Eureka 集群配置
Eureka 集群配置|学习笔记

热门文章

最新文章