小言_互联网的博客

Spring Cloud Eureka 创建一个简单的微服务

433人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场