Spring Cloud Eureka 创建一个简单的微服务
什么是 Eureka
Eureka 是 Netflix 开源的基于 REST 的服务治理解决方案,Spring Cloud 集成了 Eureka,即 Spring Cloud Eureka,提供服务注册和服务发现功能,可以和基于 Spring Boot 搭建的微服务应用轻松完成整合,开箱即用,实现 Spring Cloud 的服务治理功能。Spring Cloud 对 Netflix 开源组件进行了二次封装,也就是 Spring Cloud Netflix,Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,基于 Netflix Eureka 实现了二次封装,实际开发中,我们就使用 Spring Cloud Eureka 来完成服务治理。Spring Cloud Eureka 的组成
Spring Cloud Eureka 主要包含了服务端和客户端组件:Eureka Server 服务端、Eureka Client 客户端。
Eureka Server,是提供服务注册与发现功能的服务端,也称作服务注册中心,Eureka 支持高可用的配置。
Eureka Client 是客户端组件,它的功能是将微服务在 Eureka Server 完成注册和后期维护功能,包括续租、注销等。需要注册的微服务就是通过 Eureka Client 连接到 Eureka Server 完成注册的,通过心跳机制实现注册中心与微服务的通信,完成对各个服务的状态监控。
- Eureka Server,注册中心
- Eureka Client,所有要进行注册的微服务通过 Eureka Client 连接到 Eureka Server,完成注册。
一、代码实现
-
1、创建 Maven 父工程
-
2、在 pom.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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>springclouddemo</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR2</version> <!-- 指定pom依赖构建工程 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
-
3、在父工程下创建一个 Module ,实现 Rureka Server
-
4、在 子工程的 pom.xml 文件中添加 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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springclouddemo</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>eurekaserver</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.2.2.RELEASE</version> </dependency> </dependencies> </project>
-
5、在 resources 路径下创建文件 application.yml 文件,添加 Eureka Server 相关配置。
server: port: 8761 # 注册中心默认端口 eureka: client: register-with-eureka: false # 是否注册四自身为微服务 false fetch-registry: false # 是否同步其他注册中心的数据 service-url: defaultZone: http://localhost:8761/eureka/ # 访问注册中型的路径
-
6、在 Java 路径下创建启动类
package xyz.fusheng; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * @FileName: EurekaServerApplication * @Author: code-fusheng * @Date: 2020/5/21 23:42 * @version: 1.0 * Description: Eureka服务启动类 */ @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
-
7、打开浏览器访问 http://localhost:8761/
-
8、在父工程下创建 Module,实现 Eureka Client
-
9、在 pom.xml 文件中添加 Erueka Client 依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springclouddemo</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>eurekaclient</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies> </project>
-
10、在 resources 路径下创建配置文件 application.yml,添加 Eureka Client 相关配置,此时的客户端是服务的提供者 provider。
server: port: 8010 spring: application: name: provider # 当前服务注册名字 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # 注册中心的访问地址。 instance: prefer-ip-address: true # 是否将当前服务的 IP 注册到 Eureka Server。
-
11、在 java 路径下创建启动类 ProviderApplcation
package xyz.fusheng; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @FileName: xyz.fusheng.ProviderApplication * @Author: code-fusheng * @Date: 2020/5/22 0:18 * @version: 1.0 * Description: 服务启动类 */ @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class,args); } }
-
12、打开浏览器访问测试 http://localhost:8761/
-
13、在父工程 pom.xml 中添加 lombok 依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
-
14、创建 Student 实体类 在 eurekaclient 子工程的 java 路径下
package xyz.fusheng.entity; import lombok.Data; /** * @FileName: Student * @Author: code-fusheng * @Date: 2020/5/22 9:38 * @version: 1.0 * Description: Student 实体类 */ @Data public class Student { private long id; private String name; private int age; }
-
15、创建 StudentRepository 业务逻辑接口
package xyz.fusheng.repository; import xyz.fusheng.entity.Student; import java.util.Collection; /** * @FileName: StudentRepository * @Author: code-fusheng * @Date: 2020/5/22 9:42 * @version: 1.0 * Description: Student 业务逻辑接口 */ public interface StudentRepository { /** * 查询所有 * @return */ public Collection<Student> findAll(); /** * 根据id查询 * @return */ public Student findById(); /** * 保存更新 * @param student */ public void saveOrUpdate(Student student); /** * 根据id删除 * @param id */ public void deleteById(long id); }
-
16、创建 StudentRepositoryImpl
package xyz.fusheng.repository.impl; import org.springframework.stereotype.Repository; import xyz.fusheng.entity.Student; import xyz.fusheng.repository.StudentRepository; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * @FileName: StudentRepositoryImpl * @Author: code-fusheng * @Date: 2020/5/22 9:49 * @version: 1.0 * Description: Student 业务逻辑接口实现类 */ @Repository public class StudentRepositoryImpl implements StudentRepository { /** * 临时存储媒介 */ private Map<Long, Student> studentMap; public StudentRepositoryImpl(){ studentMap = new HashMap<>(); studentMap.put(1L, new Student(1L, "张三", 21)); studentMap.put(2L, new Student(2L, "李四", 22)); studentMap.put(3L, new Student(3L, "王五", 23)); } @Override public Collection<Student> findAll() { return studentMap.values(); } @Override public Student findById(long id) { return studentMap.get(id); } @Override public void saveOrUpdate(Student student) { studentMap.put(student.getId(), student); } @Override public void deleteById(long id) { studentMap.remove(id); } }
-
17、创建 StudentHandler 前端控制处理器
package xyz.fusheng.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import xyz.fusheng.entity.Student; import xyz.fusheng.repository.StudentRepository; import java.util.Collection; /** * @FileName: StudentHandler * @Author: code-fusheng * @Date: 2020/5/22 9:59 * @version: 1.0 * Description: Student 控制类 */ @RestController @RequestMapping("/student") public class StudentHandler { @Autowired private StudentRepository studentRepository; /** * 服务端口 */ @Value("${server.port}") private String port; /** * 打印端口 * @return */ @GetMapping("/getPort") public String getPort() { return "当前端口:" + this.port ; } /** * 查询所有 * @return */ @GetMapping("/findAll") public Collection<Student> findAll() { return studentRepository.findAll(); } /** * 根据id查询 * @param id * @return */ @GetMapping("/findById/{id}") public Student findById(@PathVariable("id") long id) { return studentRepository.findById(id); } /** * 保存 * @param student */ @PostMapping("/save") public void save(@RequestBody Student student) { studentRepository.saveOrUpdate(student); } /** * 更新 * @param student */ @PutMapping("/update") public void update(@RequestBody Student student) { studentRepository.saveOrUpdate(student); } /** * 根据id删除 * @param id */ @DeleteMapping("/deleteById/{id}") public void deletedById(@PathVariable("id") long id) { studentRepository.deleteById(id); } }
-
18、重启服务,Postman 测试接口
-
getPost 接口
-
findAll 接口
-
findById 接口
-
save 接口
-
update 接口
-
deleteById 接口
-
总结
上述操作基于 Spring Cloud 使用 Eureka Client 组件(注册中心)来注册一个服务提供者 provider 的具体实现 ,不同业务需求下的微服务统一使用 Eurake Client 组件进行注册,上述操作已经发现一个服务提供者,其他的微服务就可以调用它的接口,完成响应的业务需求。
转载:https://blog.csdn.net/qq_42999835/article/details/106276086