5.4 搭建服务注册中心
- 服务注册中心项目结构
- 在主工程下创建一个名为 microservice-cloud-eureka-7001 的 Spring Boot Module 作为服务注册中心,并在其 pom.xml 中引入以下依赖。
- 父项目指定了springcloud版本的话就不用写spring-cloud-starter-netflix-eureka-server依赖的版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-cloud-microservice</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>microservice-cloud-eureka-7001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>microservice-cloud-eureka-7001</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--为服务注册中心引入 Eureka Server 的依赖-->
<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>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 建包过程
1、导入依赖
2、编写配置文件
3、开启这个功能@EnableXXXXX
4、配置类
- 在 microservice-cloud-eureka-7001 的类路径(/resouces 目录)下,添加一个配置文件 application.yml,配置内容如下。
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka7001.comeureka服务端的实例名称,主机名是否可以在配置时确定(否则将从操作系统原语中猜测)
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #指示此客户端是否应从 eureka 服务器获取 eureka 注册表信息
service-url: #监控页面地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #发布的服务注册中心地址
- 在 microservice-cloud-eureka-7001 的主启动类上使用 @EnableEurekaServer 注解开启服务注册中心功能,接受其他服务的注册
@SpringBootApplication
@EnableEurekaServer
public class MicroserviceCloudEureka7001Application {
public static void main(String[] args) {
SpringApplication.run(MicroserviceCloudEureka7001Application.class, args);
}
}
-
启动主启动类,待成功运行后访问Eureka监控页面地址http://localhost:7001/
-
在服务启动期间出现了一个问题org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
-
造成原因:optional:在dependency标签下有一个optional标签,若将A的POM文件中某个依赖optional设置为true,则标识项目A的POM文件有如下依赖声明,optional表示该依赖只影响项目A, 如果有项目B依赖了A,则这两个依赖不会被传递;因此如果B依赖了A,并且只用到了spring-cloud-context,则需在B的POM中显示声明依赖spring-cloud-context即可,默认值为false, 此时B会自动依赖A
<!--为服务注册中心引入 Eureka Server 的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-server</artifactId> </dependency>
进入spring-cloud-netflix-eureka-client.pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-context</artifactId> <version>3.1.3</version> <scope>compile</scope> <optional>true</optional> </dependency>
- spring-cloud-netflix-eureka-server依赖下的spring-cloud-context需要显式引入。
<!--eureka中的spring-cloud-context的optional设置为true,则引用它的项目不会自动依赖,需要在自己的pom额外配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
- 或者直接使用spring-cloud-starter-netflix-eureka-server依赖,注意starter的区别
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
-
排错过程:可以利用Maven Helper插件来帮助我们分析项目中从上至下分析包间的依赖引用关系。
-
在setting-plugins中下载Maven Helper后,转到项目的pom文件,可以看到红色方框处有Dependency Analyzer的字样,
-
开始对pom进行依赖分析,选择All Dependencies as Tree模式,可以展现依赖的树状结构。图为搜索该pom引用的包中含有“cloud”字样的依赖包
-
注意:在修改了Maven Dependencies 结束后,要在Dependency Analyzer中点击Refresh UI,否则不会自动刷新。
-
转到错误问题这块来,如何定位报错的位置,需要要debug运行项目,然后对错误信息的类添加断点
-
添加断点后再次debug运行,会直接跳到即将抛异常的时刻点击链接去抛异常的点
-
发现自动装配找不到类了,在本页查找会发现有些类找不到,能编译能通过,那么为什么又会找不到呢,然后在整个项目中查找也找不到RefreshScope
-
查询eureka的 pom文件中的spring-cloud-context的依赖,我们把该jar放在自己的pom文件即可,把scope去掉,有版本管理就不需要写版本
-
然后重新启动服务,运行正常