首先要记一下cloud和boot的版本对应:
更详细的参考官方文档: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注册服务。
创建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下面还没有任何服务:
下面我们来创建第一个微服务项目。
创建第一个微服务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
这个服务。
这里有一个问题,在微服务中,很明显服务注册中心将成为至关重要的一点,一旦服务注册中心出现了故障,这个微服务架构就崩溃了,我们必须要防止这个问题的产生。由此,我们需要一个服务注册中心集群,下面以eureka集群为示例,演示一下这个功能。
注:这部分可以暂时忽略。
Eureka集群
添加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不能为空
配置域名映射
-
eureka服务的spring.application.name必须要相同,这里全面命名为eureka-server,也就是如上截图中的Application
-
配置域名映射:
配置本电脑的/etc/hosts文件,添加peer1与127.0.0.1的域名映射。以windows为例:
配置peer与本机的域名映射:
如果不开启域名映射,而使用localhost或者127.0.0.1,eureka集群就会出现在unavaiable-replicas
下面。如下:
启动项目
使用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:
Eureka-Server-2:
Eureka-Server-3:
好了,到目前为止,一个非常简单的eureka集群被我们搭建起来了。
参考资料
- SpringBoot官网netflix: `https://spring.io/projects/spring-cloud-netflix
- Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】: http://blog.didispace.com/spring-cloud-starter-dalston-1/
- Spring Cloud构建微服务架构(六)高可用服务注册中心: http://blog.didispace.com/springcloud6/
- springcloud(二):注册中心Eureka: http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html
- @EnableDiscoveryClient与@EnableEurekaClient区别:https://www.jianshu.com/p/f6db3117864f