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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值