Spring Cloud(一)服务的注册与发现Eureka

Spring Cloud简介

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

以上信息来自于百度百科:https://baike.baidu.com/item/spring cloud/20269825?fr=aladdin

简单点说:Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。
说到分布式,那么大家知道分布式应用知识的的CAP理论么?这里给大家拓展一下知识面。

CAP定理:

指的是在一个分布式系统,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),三者不可同时获得。

  1. 一致性( C ):在分布式系统中的所有数据备份,在同一时刻是否同样的值(所有节点在同一时刻的数据完全一致,越多节点,数据同步越耗时)。
  2. 可用性( A ):在集群中一部分节点故障过后,集群整体是否还能响应客户端的读写请求(对数据更新具备高可用)。
  3. 分区容错性( P ):实则高可用性,一个节点发生故障,并不影响其他节点。

CAP理论就是说在分布式存储系统中,最多只能实现上面的两点,而由于当前的网络硬件肯定会出现延迟丢包等问题,
所以分区容错性是我们必须实现的,所以我们只能在一致性和可用性之间进行权衡。

服务的注册与发现

  1. 服务注册:可以理解为服务提供者(provider),在服务启动时,向注册中心,注册自己的服务。
  2. 服务发现:可以理解为服务消费者(consumer),就是消费者去注册中心上查询注册了哪些服务,服务有多少个实例,哪些是健康的,哪些是不可用的。

常见的服务注册中心:

  1. zookeeper
  2. eureka
  3. consul
  4. etcd

这里,我就以Eureka为例,作为服务注册与发现的组件。

项目的搭建

创建父工程

创建一个Maven父工程,其他Module依赖该父工程。这里博主选择的开发工具是IDEA。现在已经有大部分开发人员,转战IDEA了。Spring Cloud版本选择Finchley.RELEASE。

首先在我们的IDEA中选择File->New->Project,选择Maven项目,输入groupId和artifactId,然后一路Next到底。
在这里插入图片描述
接着在pom文件中引入相关的依赖。
父Maven的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>com.root.project</groupId>
    <artifactId>springcloud-project</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/>
    </parent>

    <modules>
        <module>eureka-server</module>
        <module>user-service</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </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>

注意,这里的打包方式(packaging)类型是pom。

创建注册中心(Eureka)

在父工程下,新建Module。右击项目,选择New->Module,选择Spring Initializr。
在这里插入图片描述
和创建Maven项目一样,填写我们的groupId和artifactId,注意这里打包方式,选择jar。因为它是一个Spring Boot项目,会以jar的方式运行。
在这里插入图片描述
最后,选择我们需要的组件。Cloud Discovery下的Eureka Server,然后一直Next即可。
在这里插入图片描述
模块创建完成,同样需要引入相关约束。
eureka-server的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>com.root.project</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.root.project</groupId>
        <artifactId>springcloud-project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>


    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

如需启动注册中心,需要我们进行相关的配置。

1.在启动类中加入@EnableEurekaServer注解,表明这是一个注册中心。

@SpringBootApplication
/**
 * @author: 清风一阵吹我心
 * 注解表明是eureka注册中心
 * */
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

2.在application.yml文件中进行相关配置,有些朋友应该是application.properties,这都是无关紧要的,因为博主习惯使用.yml文件。

#应用名称
spring:
  application:
    name: eureka-server

#指定端口
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
    #声明自己是个服务端,server一定程度上也是client,互为client
  client:
    #由于自己就是服务器,不需要注册到自己
    register-with-eureka: false
    #由于自己就是服务器,不需要从服务器获取注册信息
    fetch-registry: false
    #服务地址
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

#自我保护机制 禁止关闭,默认是true
#  server:
#    enable-self-preservation: false

注册中心的搭建就完成了,启动浏览器,访问 http://localhost:8761,出现如下界面。
在这里插入图片描述
就证明,注册中心,搭建成功了。这是Eureka提供的一个管理服务注册与发现的控制台。可以看到Application下显示 No application available,这是因为,还没有往注册中心注册服务。

接下来,就创建一个用户服务(Eureka Client)。

创建用户服务(Eureka Client)

Client向Server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。

在父工程下,新建Module。右击项目,选择New->Module,选择Spring Initializr。和创建注册中心一样,就不加图了。然后选择我们需要的组件。因为是Client,所以需要选择Cloud Discovery下的Eureka Discovery,这里需要用到应用开发,所以,还需要加入Web模块。
在这里插入图片描述
约束引入之后,同样需要配置pom.xml。
user-service的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>com.root.project</groupId>
    <artifactId>user-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-service</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.root.project</groupId>
        <artifactId>springcloud-project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

配置完成,再去application.yml进行相关的配置。

#应用名称
spring:
  application:
    name: user-service

#端口
server:
  port: 8800

#指定注册中心
eureka:
  client:
    service-url:
      defaultzone: http://localhost:8761/eureka/

大家注意,spring.application.name这个配置很重要,因为以后服务之间的调用,一般都是根据这个name。

最后再在启动类上加入客户端的注解。

@SpringBootApplication
/**
 * @author: 清风一阵吹我心
 * @description: @EnableEurekaClient表明这个是一个eurekaclient(ps:默认可以不用加)
 */
@EnableEurekaClient
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

}

其他逻辑的实现,基本上就是Spring Boot中的操作,所以,想要入手Spring Cloud,还需要掌握Spring Boot相关知识。下面就写一些伪代码来测试一下。

创建一个用户的实体类:

package com.root.project.userservice.pojo;

import lombok.Data;

import java.io.Serializable;

/**
 * @ClassName: User
 * @Author: 清风一阵吹我心
 * @Description: TODO
 * @Date: 2019/1/17 16:26
 * @Version 1.0
 **/
@Data
public class User implements Serializable {

    private String title;
    private String author;

    public User(){

    }
    public User(String title,String author){
          this.title = title;
          this.author = author;
    }


    //使用lombok自动生成getter、setter
}

在控制层写相应的请求处理:

package com.root.project.userservice.controller;

import com.root.project.userservice.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName: UserController
 * @Author: 清风一阵吹我心
 * @Description: TODO
 * @Date: 2019/1/17 14:42
 * @Version 1.0
 **/
@RestController
@RequestMapping("/api/v1.0/")
public class UserController {

    @Value("${server.port}")
    private String port;

    @GetMapping(value = "user")
    public String helloMethod() {
        User user = new User("Spring Cloud之服务注册与发现", "清风一阵吹我心");
        return "这篇文章的标题是:" + user.getTitle() + ",作者是:" + user.getAuthor() + ",端口号是:" + port;
    }
}

启动用户服务,看一下Eureka的界面
在这里插入图片描述
可以看到箭头的标注处,就是用户服务,显示的正是application.yml中的应用名称,还有相关的端口号:8800。

当然还有人会疑惑,上面还有一段红色的文字,其实这是一个警告,意思是说:服务过于少,而且上线率比较低。这是Eureka的一种自我保护模式,可以关闭这种检查。
ps:自我保护模式禁止关闭,默认是开启状态(true)

接下来,就访问 http://localhost:8800/api/v1.0/user ,看客户端返回的结果吧。
在这里插入图片描述
文章就要接近尾声了。如有不明白的朋友,可以在下方进行留言。当然,如果博主有什么地方出了错,也欢迎大家指出。

愿你学会在孤独中,与自己交流,听自己说话,从而学会深刻。

猜你喜欢

转载自blog.csdn.net/qq_32101993/article/details/86515519