ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring cloud入门-4:服务注册中心-Eureka集群环境构建

2022-01-06 21:35:11  阅读:136  来源: 互联网

标签:服务 Spring eureka 订单 集群 注册 Eureka cloud


Spring cloud入门-4:服务注册中心-Eureka集群环境构建

1、Eureka集群环境

  上一篇博文中,我们的订单服务和消费订单模块都成功地注册到了Eureka中,现在存在的问题是:
  1)如果订单服务宕机了怎么办?那我们的消费订单模块是不是就无法调用服务了。
  2)如果Eureka Server宕机了怎么办?那我们是不是就无法管理和查看我们系统那么多服务了。
  因此,我们在Eureka的架构图中可以看到,提供服务的Service Provider和注册中心Eureka Server都是由多个模块组成的,也就是我们的集群环境,这样当其中某一台机器出现故障的时候,不会影响我们服务消费者Service Consumer去调用其他可用的服务。这样可以保证我们的服务高可用。
  在这里插入图片描述
  Eureka的工作流程如下:
  1、启动Eureka注册中心(Eureka Server);
  2、启动服务提供者的服务(Service Provider);
  3、服务提供者启动后会写入自身信息,比如将服务地址以别名方式注册进Eureka;
  4、服务消费者在调用Service Provider的服务时,使用Service Provider的服务别名去注册中心获取实际的RPC远程调用地址;
  5、服务消费者获取到调用地址后,底层利用HttpClient技术实现远程调用;
  6、服务消费者获得服务地址后,会把地址缓存在本地jvm内存中,默认每隔30秒更新一次服务调用地址;

2、Eureka集群环境构建

接下来将上一篇博文中的单机版改为集群环境,如下图,
1、构建了Eureka集群环境:Eureka7001,Eureka7002,两个Eureka Server相互注册,相互守望
2、构建了订单服务集群:Service-Provider-8001,Service-Provider-8002,任何一台服务器宕机的话,另一台服务器依然可以提供服务
在这里插入图片描述

2.1 构建Eureka服务注册中心7002

参考上一篇博文,再构建一个Eureka Server服务注册中心:cloud-eureka-server-7002。这里不再赘述细节,按照上一篇博文的步骤操作即可。
在这里插入图片描述

2.2 修改服务器映射配置文件

  由于目前我们是用一台服务器模拟集群环境,因此我们先要修改服务器的映射配置文件/etc/host,添加主机的映射。
映射配置文件修改前:
在这里插入图片描述
映射配置文件修改后:
在这里插入图片描述

修改完成后,使 hosts 文件修改生效:
sudo /etc/init.d/dns-clean start
sudo /etc/init.d/networking restart
命令行操作步骤如下:

koping@koping-HP:~$ sudo vim /etc/host
host.conf    hostname     hosts        hosts.allow  hosts.deny   
koping@koping-HP:~$ sudo vim /etc/hosts
[sudo] password for koping: 
koping@koping-HP:~$ sudo /etc/init.d/dns-clean start
Running 0dns-down to make sure resolv.conf is ok...done.
koping@koping-HP:~$ sudo /etc/init.d/networking restart
[ ok ] Restarting networking (via systemctl): networking.service.
koping@koping-HP:~$ 

2.3 写yml

首先修改Eureka-Server-7001注册中心的配置文件。如下图,7001的实例名改为:eureka7001.com。也就是我们刚刚在映射配置文件中所配置的名称。然后将注册中心由自己改为7002,保证7001和7002相互注册,相互守望。
在这里插入图片描述

同理,Eureka-Server-7002也是相似的改法。
在这里插入图片描述

server.port=7002

# eureka服务端的实例名称
#eureka.instance.hostname=localhost
eureka.instance.hostname=eureka7002.com
# false表示不向注册中心注册自己
eureka.client.register-with-eureka=false
# false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
# 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
#eureka.client.service-url.defaultZone=http://${eureka.instance.hostname=localhost}:${server.port}/eureka/
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/

2.4 主启动

启动Eureka-server-7001,eureka-server-7002。
此时访问Eureka-server-7001时:http://eureka7001.com:7001/。
可以看到已经注册到eureka7002注册中心上了。
在这里插入图片描述
同理,eureka-server-7002也已经注册到eureka7001上了。
在这里插入图片描述

2.5 将订单服务8001发布到eureka集群

修改订单服务8001的配置文件:
将注册到一台eureka的配置,改为注册到eureka集群中:
在这里插入图片描述

server.port=8001

spring.application.name=cloud-payment-service
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=org.gjt.mm.mysql.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123

mybatis.mapperLocations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.springcloud.entities

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

修改好配置文件后,启动订单服务8001,然后刷新eureka-server-7001。如下图,可以看到订单服务已经成功注册。
在这里插入图片描述
同理,订单服务(CLOUD-PAYMENT-SERVICE)也成功注册到eureka-server-7002中。
在这里插入图片描述

2.6 将消费订单模块80发布到eureka集群

同理,将消费订单模块也修改为注册到eureka集群中:
在这里插入图片描述

启动消费订单模块,然后刷新eureka-server-7001和eureka-server-7002,同样可以看到消费订单模块也成功注册到集群中:
在这里插入图片描述
在这里插入图片描述

2.7 测试

依然还是测试我们之前创建的3号订单,可以看到,通过eureka集群注册后的服务,依然可以使用:
在这里插入图片描述

3、订单服务集群环境搭建

如下图,我们已经构建了eureka的集群(eureka-7001,eureka7002),此时我们再来构建服务提供集群。
在这里插入图片描述

3.1 新建订单服务8002

构建订单服务8002,可以完全参考订单服务8001,这里也不再赘述。
在这里插入图片描述
在这里插入图片描述

3.2 订单服务controller添加端口信息

接下来我们在订单服务controller中添加端口信息,方便我们查看调用的是哪个服务处理了请求。
我们先在订单服务8001的controller添加端口信息,如下表:
在这里插入图片描述
同理,在订单服务8002中也添加对应信息:

package com.example.springcloud.controller;

import com.example.springcloud.entities.CommonResult;
import com.example.springcloud.entities.Payment;
import com.example.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String 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(500, "插入数据失败, serverPort: " + serverPort);
        }
    }

    @GetMapping(value = "/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id) {
        Payment payment = paymentService.getPaymentById(id);
        log.info("读取订单: " + payment);

        if (payment==null) {
            return new CommonResult(500, "未查询到该订单,查询id: " + id);
        } else {
            return new CommonResult(200, "查询成功, serverPort: " + serverPort, payment);
        }
    }
}

3.3 修改消费订单模块controller的调用地址

如下图,将之前单机版中写死的服务IP地址和端口号,改为eureka中的服务名称,具体访问哪个IP哪个端口,会由eureka server帮我们进行分配。
在这里插入图片描述

3.4 消费订单模块的RestTemplate开启@LoadBalanced注解

我们现在将调用服务的地址写为了服务名称后,还需要使用@LoadBalanced注解赋予RestTemplate负载均衡的能力。
在这里插入图片描述

4、测试集群环境

4.1 测试eureka集群环境

启动eureka集群(7001,7002)、订单服务集群(8001,8002)、消费订单模块。
由下图可以看到,
1、eureka7001注册进了eureka server7002中,他们2个相互注册。
2、注册中心中注册了1个消费订单模块(CLOUD-ORDER-SERVICE),2个订单服务(CLOUD-PAYMENT-SERVICE)。同时我们能看到每个服务所对应的IP地址和端口号
在这里插入图片描述

4.2 测试服务调用

测试依然还是查看我们之前创建的3号订单服务:cloth-00001。
由下图可以看到,第1次是8001订单服务处理了请求,第2次是8002订单服务处理了请求。如果一直请求的话,会轮询这2个服务。
因此,Ribbon和Eureka整合后,我们的调用方可以直接调用服务名称,而不用再关心调用地址和端口号,并且该服务还具有负载均衡能力
在这里插入图片描述
在这里插入图片描述

4.3 测试订单服务宕机

此时,我们模拟订单服务8001宕机(将8001服务关闭),看看服务能否继续调用。
1)如下图,当8001服务关闭后,eureka server就已经检测到8001服务不可用了:
在这里插入图片描述
2)再过了几秒钟之后,eureka-server确认服务已不可用,因此将其移除:
在这里插入图片描述
3)这个使用,消费订单服务一直发请求,就都是8002订单服务处理请求了。
在这里插入图片描述
通过以上测试可以看到,当其中某一个服务宕机时,可以保障另一个服务继续处理请求。

到此,服务注册中心eureka集群环境和服务提供集群环境搭建完毕。

最后展示一下截止到目前的工程目录结构:
在这里插入图片描述

标签:服务,Spring,eureka,订单,集群,注册,Eureka,cloud
来源: https://blog.csdn.net/xueping_wu/article/details/122340832

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有