一、前言
我们在别的章节中已经详细讲解过eureka注册中心的作用,本节会简单讲解eureka作用,侧重注册中心的搭建。
Eureka作为服务注册中心可以进行服务注册和服务发现,注册在上面的服务可以到Eureka上进行服务实例的拉取,主要作用就是进行请求时的负载均衡。在注册中心注册了orderService服务,但是这个服务有多个实例,实例A的端口是8001,实例B的端口是8002,在我们之前请求orderService服务的时候会指明具体的端口号,但指明了端口号,请求就总往一台服务上进行发送,其他服务就无法分担请求。这样orderService服务的集群就失效了,还是单台服务抗下了所有,但有了注册中心后,我们请求时就不需要声明具体的端口号,而是服务名,向指明了服务名的服务发起请求就可以了,请求会根据默认的请求规则(轮询),向A、B服务实例发起请求。
以下创建的模块,JDK为1.8,注意要在Project Structure中设置
二、搭建注册中心
1. 搭建SpringBoot项目
创建一个SpringBoot【cloud-eureka-demo】项目。
版本最好同我的一致:
- SpringBoot选择
2.3.12.RELEASE
【这个版本必须搭配JDK1.8,17不行】
2. 搭建Eureka注册中心
在上面创建好的SpringBoot 项目上新建一个模块:【eureka-server】
虽然我们这里是新建模块,但是要注意新建模块有两种方式,上面创建的是一个独立的模块,与【cloud-eureka-demo】并不存在父子模块的关系,eureka与其他模块不存在依赖关系,应该作为独立模块存在,可以单独部署。在微服务项目中各个模块本身就是独立的一个服务,所以可以使用这种方式创建,项目结构目录直接帮我们创建好了,挺省事的。如果要创建父子关系的模块,可以使用下面的方式:
这里就会让我们选择父模块。
在微服务项目中使用Maven创建具有父子模块关系的项目结构好还是独立的模块好?
对于微服务项目,通常推荐使用Maven创建具有父子模块关系的项目结构。
使用Maven创建具有父子模块关系的项目可以带来以下几个优势:
- 模块化管理 :通过父子模块的关系,可以将不同的功能或服务划分为独立的子模块,并且可以分别进行构建、测试和部署。这样可以提高项目的可维护性和扩展性。注意:父子模块的关系并不会影响各个子模块的独立构建和部署。每个子模块都有自己的构建配置和插件配置,可以独立进行构建和部署。对于测试,也可以针对每个子模块进行独立的测试,以保证测试的独立性和有效性。
- 依赖管理:通过在父模块中定义公共的依赖和版本信息,可以确保各个子模块之间的依赖关系是一致的。这样可以减少冲突和版本不一致的问题,并且简化了依赖管理的工作。
- 统一构建和发布:使用父模块的pom.xml文件可以统一管理项目的构建配置和插件配置。这样可以确保各个子模块在构建过程中遵循相同的规范和流程,并且可以方便地进行整体构建和发布。
- 可重用性 :父模块可以作为一个通用的框架或基础设施模块,提供公共的代码、配置和工具类等,供子模块进行复用。这样可以提高代码的可重用性和开发效率。
总之,使用Maven创建具有父子模块关系的项目结构可以提供更好的模块化管理、依赖管理和统一构建发布等优势。这种方式适用于较大型的微服务项目或者需要更灵活组织结构的项目。
对于微服务项目,使用独立的模块也是一种常见的方式,特别是当各个模块对应的是独立的服务时。
使用独立的模块可以带来以下几个优势:
- 独立部署:每个模块可以独立进行构建、测试和部署,这样可以更灵活地对每个服务进行管理和扩展。如果某个模块需要进行升级或者有故障发生,可以只对该模块进行处理,而不会影响其他模块。
- 解耦合:每个模块可以独立开发和维护,它们之间通过定义好的接口进行通信,从而实现了解耦合。这样可以提高系统的可维护性和可扩展性,也方便团队并行开发。
- 技术栈灵活:不同的模块可以选择不同的技术栈和框架来实现,根据具体需求选择最适合的技术栈。这样可以充分发挥各个模块的特长,并且可以更好地满足业务需求。
- 服务独立性 :每个模块对应一个独立的服务,可以根据需要对每个服务进行独立的水平扩展和负载均衡配置,以满足不同的性能和可用性要求。
总结来说,使用独立的模块可以提供更好的独立部署、解耦合、技术栈灵活性和服务独立性。这种方式适用于对每个服务的独立性要求较高的微服务项目。
2.1. 版本搭配
- 引入Eureka依赖需要引入SpringCloud
- SpringCloud->
Hoxton.SR1
版本与JDK8
搭配
pom.xml
xml
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lzk</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>eureka-server</description>
<properties>
<java.version>8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2. 配置文件
yml
spring:
application:
name: eurekaserver
server:
port: 10086
eureka:
client:
# 是否将自身作为一个eureka服务注册
register-with-eureka: false
# 是否从服务上拉取服务实例
fetch-registry: false
service-url:
defaultZone: http://localhost:10086/eureka
2.3. 启动类
在启动类上添加@EnableEurekaServer
注解
java
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2.4. 访问服务
启动服务后,如果出现以下错误是版本错误,检查项目是否是JDK8
在浏览器上访问:http://localhost:10086/,出现以下页面就是成功搭建了注册中心。
三、服务注册-提供者
1. 创建SpringBoot项目
创建一个名为【provider-server】的项目。
2. pom.xml
xml
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lzk</groupId>
<artifactId>provide-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provide-server</name>
<description>provide-server</description>
<properties>
<java.version>8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.1.RELEASE</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-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意: 引入的eureka-client
为:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
而不是下面这个:引入这个依赖服务注册不到注册中心上去
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
</dependency>
3. 配置文件
application.yml
yml
spring:
application:
name: userservice
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
4. 启动类
在启动类上添加:@EnableEurekaClient
注解,用于将服务注册到注册中心上
java
@SpringBootApplication
@EnableEurekaClient
public class ProvideServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProvideServerApplication.class, args);
}
}
5. UserController
创建userController用于提供服务,便于后面测试:
java
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login(){
return "8080 login success";
}
}
6. 克隆服务
将上面的服务再创建一次,服务端口改为:8081,userController中改为return "8081 login success
,便于测试。
我们这是创建服务提供者,服务提供者是为了给消费者提供服务,但二者身份不是唯一的,提供者可能也是一个消费者,消费者可能也是一个提供者。
7. 服务启动
两个服务启动后会注册到eureka上,可以在注册中心看到:
四、服务注册-消费者
1. 创建SpringBoot项目
创建一个名为【consumer-server】的服务
2. pom.xml
pom文件同服务提供者的一致
3. 配置文件
yml
spring:
application:
name: orderservice
server:
port: 8083
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
4. 启动类
同提供者一样,增加一个@EnableEurekaClient
注解
5. OrderController
要调用服务提供者提供的服务。
@Bean注解将方法返回值注册到Spring容器中,@Bean要同@Component注解或其派生注解共同使用。
java
@RestController
@RequestMapping("order")
public class OrderController {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@GetMapping("/info")
public String getOrderInfo(){
String url = "http://userservice/user/login";
String info = restTemplate.getForObject(url, String.class);
return "订单滴滴:" + info;
}
}
6. 服务启动访问
访问:http://localhost:8083/order/info
由于RestTemplate添加了@LoadBalanced
注解,所以请求会被负载均衡,这也是注册中心的作用所在,eureka还会进行服务健康监测,例如:8082端口的userservice服务宕机,那么该服务会从服务实例中剔除,下次orderservice拉取服务实例时,就拉取不到8082的userservice了。
userservice会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除