Loading... 本节示例代码在: [https://github.com/laolunsi/spring-boot-stack](https://github.com/laolunsi/spring-boot-stack) --- 首先要记一下cloud和boot的版本对应: ![file](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577283229057.png) 更详细的参考官方文档:[https://spring.io/projects/spring-cloud/](https://spring.io/projects/spring-cloud/) 创建项目也可以利用官网的api:[https://start.spring.io/](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项目,引入如下依赖: ```xml <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配置文件: ```yaml 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`注解: ```java 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](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284459653.png) 下面我们来创建第一个微服务项目。 --- ### 1.2 创建第一个微服务eureka-client 简单的,创建一个springboot项目,引入`spring-cloud-starter-netflix-eureka-client`依赖: ```xml <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> ``` 修改配置文件: ```yaml spring: application: name: eureka-client1 server: port: 8101 eureka: client: service-url: defaultZone: 'http://localhost:8100/eureka' ``` 然后再在启动类上加上`@EnableDiscoveryClient`注解: ```java 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做服务中心时有效。 启动项目,可以看到控制台输出有这么一条: ```java 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](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284491535.png) 这里有一个问题,在微服务中,很明显服务注册中心将成为至关重要的一点,一旦服务注册中心出现了故障,这个微服务架构就崩溃了,我们必须要防止这个问题的产生。由此,我们需要一个服务注册中心集群,下面以eureka集群为示例,演示一下这个功能。 注:这部分可以暂时忽略。 ------ ## 二、Eureka集群 ### 2.1 添加eureka-server多配置文件 本次以三个Eureka服务,一个单独的Client服务为例,演示Eureka集群。 在server下创建三个新的yml文件,分别命名为:`application-peer1.yml`, `application-peer2.yml`, `application-peer3.yml`,分别对应端口号8201, 8202, 8203 填写配置文件(以集群1为例): ```yaml # 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](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284571528.png) 如果不开启域名映射,而使用localhost或者127.0.0.1,eureka集群就会出现在`unavaiable-replicas`下面。如下: ![file](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284589896.png) --- ### 2.3 启动项目 使用maven打包eureka-server后,基于不同的yml配置文件进行启动不同的Eureka服务,使用如下命令执行targert下的jar包或者war包即可: ```shell java -jar xxxx.jar --spring.profiles.active=peer1 ``` 启动三个eureka-server服务,然后启动另外一个Client服务。 这里我们需要修改一下client服务的注册地址配置: ```yaml eureka: client: service-url: defaultZone: 'http://peer1:8201/eureka,http://peer2:8202/eureka,http://peer3:8203/eureka' ``` 也就是让client向三个eureka服务都注册服务。 全部启动后,等待一会儿,打开浏览器,看到如下页面: Eureka-Server-1: ![file](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284606184.png) Eureka-Server-2: ![file](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284616380.png) Eureka-Server-3: ![file](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1577284625682.png) 好了,到目前为止,一个非常简单的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 25, 2019 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 请作者喝杯肥宅快乐水吧!