本节示例代码在: https://github.com/laolunsi/spring-boot-stack


首先要记一下cloud和boot的版本对应:
file

更详细的参考官方文档:https://spring.io/projects/spring-cloud/

创建项目也可以利用官网的api:https://start.spring.io/

注意,在本系列的文档中,采用的SpringBoot和SpringCloud版本是对应的。默认使用Finchley.RELEASE版本,与之对应的SpringBoot是2.0.x。也会使用SpringBoot2.1.x和对应的SpringCloud Greenwich.SR2。


一、基本的服务注册与发现

SpringCloud默认的服务注册与发现组件是Eureka,我们这里显示如何使用构建eureka服务端、如何通过eureka注册服务。


1.1 创建eureka服务端

创建一个SpringBoot项目,引入如下依赖:

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <!-- 引入springboot-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- 引入netflix下的eureka,用于服务注册与发现 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

修改项目application.yml配置文件:

server:
  port: 8100
spring:
  application:
    name: eureka-server
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      # 这里必须设置defaultZone,否则会出现连接异常:org.apache.http.conn.ConnectTimeoutException: Connect to localhost:8761 timed out
      # 具体可以参考EurekaClientConfigBean这个类,默认的url是http://localhost:8761/eureka/
      defaultZone: 'http://127.0.0.1:${server.port}/eureka'

下面在启动类上添加@EnableEurekaServer注解:

package com.example.eurekaserver;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

启动项目,打开浏览器,输入localhost:8100,可以看到eureka的页面了,注意现在instances下面还没有任何服务:
file

下面我们来创建第一个微服务项目。


1.2 创建第一个微服务eureka-client

简单的,创建一个springboot项目,引入spring-cloud-starter-netflix-eureka-client依赖:

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- 引入netflix的eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

修改配置文件:

spring:
  application:
    name: eureka-client1
server:
  port: 8101
eureka:
  client:
    service-url:
      defaultZone: 'http://localhost:8100/eureka'

然后再在启动类上加上@EnableDiscoveryClient注解:

package com.example.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {

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

}

注:也可以使用@EnableEurekaClient注解,区别在于@EnableDiscoveryClient是SpringCloud自带的,而@EnableEurekaClient只对eureka做服务中心时有效。

启动项目,可以看到控制台输出有这么一条:

2019-08-31 10:15:10.925  INFO 17684 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application eureka-client1 with eureka with status UP

服务注册成功了。我们来检查一下,重新打开localhost:8100,刷新页面,可以看到instances下面出现了EUREKA-CLIENT1这个服务。

file

这里有一个问题,在微服务中,很明显服务注册中心将成为至关重要的一点,一旦服务注册中心出现了故障,这个微服务架构就崩溃了,我们必须要防止这个问题的产生。由此,我们需要一个服务注册中心集群,下面以eureka集群为示例,演示一下这个功能。

注:这部分可以暂时忽略。


二、Eureka集群

2.1 添加eureka-server多配置文件

本次以三个Eureka服务,一个单独的Client服务为例,演示Eureka集群。

在server下创建三个新的yml文件,分别命名为:application-peer1.yml, application-peer2.yml, application-peer3.yml,分别对应端口号8201, 8202, 8203

填写配置文件(以集群1为例):

# eureka集群1
server:
  port: 8201
spring:
  application:
    name: eureka-server # eureka服务的application.name要相同
eureka:
  client:
    register-with-eureka: true # 将eureka服务器注册为服务
    fetch-registry: true # 获取注册信息
    service-url:
      defaultZone: 'http://peer2:8202/eureka,http://peer3:8203/eureka' # 将注册服务器地址写成另外两个集群的地址,此处用peer2和peer3代理localhost或127.0.0.1
  instance:
    hostname: peer1 # 注意hostname不能为空

2.2 配置域名映射

  1. eureka服务的spring.application.name必须要相同,这里全面命名为eureka-server,也就是如上截图中的Application
  2. 配置域名映射:

配置本电脑的/etc/hosts文件,添加peer1与127.0.0.1的域名映射。以windows为例:

 ![file](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284549522.png)

配置peer与本机的域名映射:
file

如果不开启域名映射,而使用localhost或者127.0.0.1,eureka集群就会出现在unavaiable-replicas下面。如下:
file


2.3 启动项目

使用maven打包eureka-server后,基于不同的yml配置文件进行启动不同的Eureka服务,使用如下命令执行targert下的jar包或者war包即可:

java -jar xxxx.jar --spring.profiles.active=peer1

启动三个eureka-server服务,然后启动另外一个Client服务。

这里我们需要修改一下client服务的注册地址配置:

eureka:
  client:
    service-url:
      defaultZone: 'http://peer1:8201/eureka,http://peer2:8202/eureka,http://peer3:8203/eureka'

也就是让client向三个eureka服务都注册服务。

全部启动后,等待一会儿,打开浏览器,看到如下页面:

Eureka-Server-1:
file

Eureka-Server-2:
file

Eureka-Server-3:
file

好了,到目前为止,一个非常简单的eureka集群被我们搭建起来了。


参考资料

  1. SpringBoot官网netflix: `https://spring.io/projects/spring-cloud-netflix
  2. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】: http://blog.didispace.com/spring-cloud-starter-dalston-1/
  3. Spring Cloud构建微服务架构(六)高可用服务注册中心: http://blog.didispace.com/springcloud6/
  4. springcloud(二):注册中心Eureka: http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html
  5. @EnableDiscoveryClient与@EnableEurekaClient区别:https://www.jianshu.com/p/f6db3117864f
Last modification:December 25th, 2019 at 11:08 pm
请作者喝杯肥宅快乐水吧!