SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 SpringCloud中集成Eureka实现集群部署服务注册与服务提供者,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例:

SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例_霸道流氓气质的博客-CSDN博客

SpringCloud分布式微服务项目Common通用依赖模块抽离:

SpringCloud分布式微服务项目Common通用依赖模块抽离_霸道流氓气质的博客-CSDN博客

在上面搭建项目结构基础上,首先是实现了单机模式下集成Eureka。

SpringCloud中集成Eureka实现服务注册(单机Eureka构建):

SpringCloud中集成Eureka实现服务注册(单机Eureka构建)_霸道流氓气质的博客-CSDN博客

Eureka集群原理

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

微服务RPC远程服务调用最核心的是高可用,如果注册中心只有一个,如果除了故障,会导致整个服务环境不可用。

Eureka集群的实现原理就是互相注册,相互守望。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、参考上面搭建7001Eureka服务注册中心的过程,再新建一个子模块7002

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

与7001一样,pom文件中添加eureka-server的依赖

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

新建主启动类EurekaMain7002并添加注解@EnableEurekaServer

package com.badao.springclouddemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
    public static void main(String[] args){
        SpringApplication.run(EurekaMain7002.class,args);
    }
}

2、修改hosts文件

注意与之前单机模式下不同,在配置文件中配置eureka服务端的实例名称时如果再一台电脑下避免出现重复问题,

所以修改C:\Windows\System32\drivers\etc下的hosts文件

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

添加如下

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

使本机ip能映射出两个域名。

3、修改配置文件application.yml

修改Eureka Server7001的application.yml,配置eureka服务端的实例名称为eureka7001.com

并且将其service-url下的defaultZone指向其它eureka,这里将其指向7002

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/

上面讲的集群搭建就是相互注册,相互守望,如果是搭建了三个集群,则1指向2和3,2指向1和3这种类推。

然后新建并修改Eureka Server7002的application.yml,配置其eureka服务端的实例名称为eureka7002.com

然后将其指向7001

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/

4、修改服务注册的服务提供者和服务消费者的注册方式

前面单机模式下,服务注册的方式是在application.yml中指向一个Eureka Server,现在集群模式下,需要将其

修改为注册到多个Eureka Server中

修改服务提供者8001的配置文件

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

同样修改服务消费者88的配置文件

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

5、测试效果

分别启动Eureka Server7001和7002,然后启动服务提供者8001和服务消费者88服务

访问

http://eureka7001.com:7001/

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

可以看到和7002互为守望,服务注册者和消费者也已经注册成功。

再访问

http://eureka7002.com:7002/

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

可以看到和7001互为守望,服务注册者和消费者也已经注册成功。

6、服务提供者集群搭建

通过上面实现了Eureka Server 集群的搭建,那么如果服务提供者也是只有一个的话,一旦宕机,也达不到集群的目的。

所以对于服务提供者同样也需要进行集群的搭建。

上面已经建立的服务提供者8001服务,参考其新建过程,复制一个一模一样只有端口为8002的服务

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

修改其pom文件中的依赖与8001一致

    <dependencies>
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>com.badao</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

新建并修改其yml,从8001复制并修改其端口号

server:
  port: 8002

spring:
  application:
    name: cloud-payment-service

  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
   url:jdbc:mysql://localhost:3306/springclouddemo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456

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


mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.badao.springclouddemo.entities    # 所有Entity别名类所在包

从8001复制主启动类并修改名称为8002

然后其他业务类均从8001复制到8002,使服务提供者具备8001和8002两个服务

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

为了后面能演示出消费者调用服务提供者时负载均衡的效果,在服务提供者的Controller中加入端口的输出

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

7、服务消费者修改负载均衡

之前在服务消费者88服务中调用服务提供者服务时,url是固定写死的,这种只适用于单机模式,显示服务提供者

已经搭建了集群,所以不能再写死服务提供者的地址了,而是要通过服务提供者的别名进行访问

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

这个别名可以在Eureka中获取

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

而服务的别名的设置是在服务提供者的配置文件中配置

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

消费者服务在调用服务时要支持负载均衡,需要在RestTemplate的配置中使用@LoadBalanced注解赋予负载均衡的能力。

package com.badao.springclouddemo.config;

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
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

8、测试集群搭建效果

启动7001和7002这两个Eureka Server,然后启动8001和8002这两个服务提供者,然后再启动88服务消费者

通过服务消费者访问服务提供者的服务,可以通过返回结果中的端口号看到负载均衡的效果

SpringCloud中集成Eureka实现集群部署服务注册与服务提供者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135961.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!