Eureka集群部署,服务器释压之多台服务器分开部署服务,服务之间相互调用,分布式注册中心Eureka的辉煌再现

背景

        Eureka,SpringCloud第一代产品,虽说目前Nacos已经席卷而来,基本要掀翻Eureka,但是难免老系统用到的注册中心是Eureka,那么正好,我在操作这个老系统的时候,就遇到了一些坑,我想把多个服务通过两台服务器来完成部署,AB服务器各部署一半,释压的同时,腾出内存,当我以自认为无比清晰的思路去弄,以为一下子就能好时,发现事与愿违,足足花了我N小时,最后仍然只是小细节,踩了坑之后各位就看到了这篇文章,我能怎么办,我也很无奈。

 场景

        还是一句老话,脱离实战场景讲技术都是耍流氓。我们上我的战略部署思路分析图。

        首先在A服务器上有如下一个部署形式,过多的服务单独部署在一台服务器上导致A服务器是负债累累、疲惫不堪

         那么在我分析了一次之后,我将其规划成了如下:

1.将A服务器拆掉Sms、User、Pay等模块

2.在B服务器部署Sms、User、Pay等模块,同时部署一台Eureka,使用Eureka集群维持服务的高可用容灾

        当然,有经验的小伙伴可能会说,如果使用ABC三台服务器部署三台Eureka,再使用五台服务器每台部署一个服务,岂不是可用性更强?针对这个问题,我们就能得知,要针对实际场景分析问题,而不仅仅是高大上、造大炮的理论知识。实际场景就是服务器有限,如何能更好的方式获取稳定性、可用性让用户体验变得更好! 

 

 实战

         那么分析完要做什么,思路有了之后,我们开始实战。老规矩,拉取代码了直接看调试。

实战代码地址:https://gitee.com/yiang-hz/blog.git 路径:blog->springcloud->eureka

        实战代码分为两个部分,第一个部分即是单独部署的Eureka,第二部分则是集群分开部署,集群分开部署,支持两种场景,同一台机器的伪集群(同一个服务不同端口号启动)与真实场景的集群(多台机器部署Eureka)。

单独启动Eureka

        步骤1:创建项目,导入Maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.10.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

        步骤2:启动类

@SpringBootApplication
@EnableEurekaServer
public class EurekaAloneApp {

    public static void main(String[] args) {
        SpringApplication.run(EurekaAloneApp.class, args);
    }
}

        步骤3:application.yml配置文件

spring:
  application:
    name: eureka-alone-server
#启动端口,Eureka默认端口为8761
server:
  port: 8761

eureka:
  client:
    #是否注册自身,当独立启动时,无需注册,集群则需要注册
    register-with-eureka: false
    #是否获取eureka注册的其它服务信息,当独立启动时,无需获取,集群则需要获取
    fetch-registry: false
    #注册地址,如果是集群通过逗号 , 分割配置
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
  #是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
  instance:
    prefer-ip-address: true

集群配置Eureka

        步骤1与步骤2可同上

        步骤3:application.yml配置文件

这里改变了集群需要改变的配置,同理配置了真伪集群两种模式的地址方便测试使用

#服务启动名称,eureka集群时名称必须一致
spring:
  application:
    name: eureka-cluster-server
#启动端口,Eureka默认端口为8761
server:
  port: 8761

eureka:
  client:
    #是否注册自身,当独立启动时,无需注册,集群则需要注册
    register-with-eureka: true
    #是否获取eureka注册的其它服务信息,当独立启动时,无需获取,集群则需要获取
    fetch-registry: true
    #注册地址,如果是集群通过逗号 , 分割配置
    service-url:
      #伪集群链接地址,伪集群:同一台机器不同端口部署多个相同的服务
      #defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
      #真集群配置
      defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
  instance:
    #是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
    prefer-ip-address: true
    #心跳时间 发送心跳包校验时间 单位为秒 默认为30秒
    lease-renewal-interval-in-seconds: 30
    #剔除时间 心跳丢失后服务端剔除服务时间 单位为秒 默认为90秒
    lease-expiration-duration-in-seconds: 90

        步骤4:创建客户端服务Member

 Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

配置文件:

server:
  port: 8689

spring:
  application:
    name: member-server

eureka:
  client:
    #是否注册自身,客户端需要为true
    register-with-eureka: true
    #是否获取eureka注册的其它服务信息,客户端需要为true
    fetch-registry: true
    #注册地址,如果是集群通过逗号 , 分割配置
    service-url:
      #伪集群链接地址
      #defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
      #真集群配置
      defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
  #是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
  instance:
    prefer-ip-address: true

启动类:

@SpringBootApplication
public class MemberApp {

    public static void main(String[] args) {
        SpringApplication.run(MemberApp.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

测试controller:

@RestController
public class MemberController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getMember/{name}")
    public Object getMember(@PathVariable("name") String name) {
        return "member:" + name;
    }

    @GetMapping("/getMemberOrder/{id}")
    public Object getMemberOrder(@PathVariable("id") String id) {
        //请求示例:http://localhost:8689/getMemberOrder/1 返回:member -> order response:order:1
        String orderResult = restTemplate.getForObject(
                "http://order-server/getOrder/" + id, String.class
        );
        return "member -> order response:" + orderResult;
    }
}

        步骤5:创建客户端服务Order

Maven:同Member

配置文件:

server:
  port: 8688

spring:
  application:
    name: order-server

eureka:
  client:
    #是否注册自身,客户端需要为true
    register-with-eureka: true
    #是否获取eureka注册的其它服务信息,客户端需要为true
    fetch-registry: true
    #注册地址,如果是集群通过逗号 , 分割配置
    service-url:
      #伪集群链接地址
      #defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
      #真集群配置
      defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
  #是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
  instance:
    prefer-ip-address: true

启动类:

@SpringBootApplication
public class OrderApp {

    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

测试Controller:

@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getOrder/{id}")
    public Object getOrder(@PathVariable("id") String id) {
        return "order:" + id;
    }

    @GetMapping("/getMember/{name}")
    public Object getMember(@PathVariable("name") String name) {
        //请求示例:http://localhost:8688/getMember/lip 返回:order -> member response:member:lip
        String memberResult = restTemplate.getForObject(
                "http://member-server/getMember/" + name, String.class
        );
        return "order -> member response:" + memberResult;
    }
}

调试

        代码编写完成之后我们开始调试进行分析

单独启动

        单独启动Eureka时,需注意无需注册其本身,以及也无需获取服务信息,因为本身就有。故以下配置为false

#是否注册自身,当独立启动时,无需注册,集群则需要注册
eureka.client.register-with-eureka: false
#是否获取eureka注册的其它服务信息,当独立启动时,无需获取,集群则需要获取
eureka.client.fetch-registry: false

集群启动

        集群则与单机启动相反,以上配置都需要改为true。且配置地址是有多少台集群,则一一配置上去。

#注册地址,如果是集群通过逗号 , 分割配置
service-url:
  #伪集群链接地址
  #defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
  #真集群配置
  defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/

        注意:伪集群是为了方便测试,可以通过IDEA的并行示例启动,通过不同的端口即可一台机器也能测试集群环境。真集群是有两台在同一局域网下的机器可以进行操作的方式。

PS:支持并行运行的方式在文章最末尾。

真集群部署方式

        条件:两台局域网内的服务器,A启动Eureka与Order,B启动Eureka与Member。

启动后如图:

A服务器访问:http://localhost:8688/getMember/lip 可以调用到B服务器的Member服务。

B服务器访问:http://localhost:8689/getMemberOrder/1 可以调用到A服务器的Order服务。

AB服务器亦可通过对方IP与端口拼接路径来进行请求。如:http://192.168.0.114:8689/getMemberOrder/1

至此,部署完成。

伪集群部署方式

        同一台机器启动所有服务。两台Eureka,并行一个8761,并行一个8762。然后启动member服务与Order服务。调用同真集群部署方式。直接在该服务器进行操作即可

启动后如图:

IDEA支持并行运行

        步骤1:点击修改参数

         步骤2:选择对应的启动项,打开并行运行 

总结

        以上即是Eureka的单独部署与集群模式实现,实现起来并不是太复杂,但是脱离案例只讲理论或者只学理论,实际使用到还是会有很多坑,要知道 做到比知道难三倍! 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud 的各个组件可以分别部署在多个服务器上,通过网络通信协作完成服务的注册、发现、调用、负载均衡、熔断和监控等功能。 Spring Cloud 的核心组件 Eureka Server 用于服务的注册和发现,它可以部署在一台独立的服务器上,服务提供者将自己的服务实例信息注册到 Eureka Server 上,服务消费者从 Eureka Server 中获取可用的服务实例信息。 Spring Cloud 的网关组件 Gateway Server 用于请求的路由和转发,它可以部署在一台独立的服务器上,服务消费者将请求发送给 Gateway Server,由 Gateway Server 决定将请求路由到哪个服务提供者,从而实现请求的分发和负载均衡。 Spring Cloud 的服务提供者和服务消费者可以分别部署在多个服务器上,它们之间通过 Eureka Server 进行服务的注册和发现,服务消费者通过 Ribbon 进行负载均衡,同时可以使用 Feign 或 RestTemplate 进行服务调用服务提供者可以实现熔断器来保证服务的可靠性和稳定性。 Spring Cloud 的分布式跟踪系统 Zipkin Server 用于监控服务之间调用关系和性能,它可以部署在一台独立的服务器上,服务提供者将调用信息发送给 Zipkin Server,Zipkin Server 对调用信息进行聚合和分析,从而帮助开发者快速定位和解决服务调用问题。 综上所述,Spring Cloud 的各个组件可以分别部署在多个服务器上,通过网络通信协作完成服务的注册、发现、调用、负载均衡、熔断和监控等功能,从而实现分布式系统的开发和部署

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值