SpringCloud 教程 | 第一章: 服务的注册与发现(Eureka)

最近在学习SpringCloud相关的知识,受益匪浅。谨以此博文记录自己的学习历程,同时也为大家学习SpringCloud提供些许参考。后续会根据学习进度适时更新博文。

前言

传统web服务开发及部署流程

如上图。我们在开发传统web项目时,除了开发正常功能之外,我们一般还会开发一些辅助功能。例如:日志收集系统、健康情况上报、filter过滤器等等。在实施部署阶段,我们需要配网关、做代理、搞负载等等。这样,无论是在开发阶段还是部署阶段,都是繁琐的、冗余的、耦合性很高的,SpringCloud框架就可以完美解决这一点。

SpringCloud简介

SpringCloud为开发和实施人员提供了快速构建分布式系统的常用组件,包括配置管理、服务治理、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。使用Spring Cloud, 开发人员可以管理Spring Boot创建的各个微服务应用,并且在任何分布式环境下都能工作得非常好,小到笔记本电脑, 大到数据中心和云平台。实施人员也可方便的进行路由切换、蓝绿部署、滚动升级等操作。

一、Eureka简介

Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它可以很容易的与Springboot构建的微服务整合起来。主要负责完成微服务架构中的服务治理功能。

服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。

1.1 Eureka服务端

Eureka服务端,即服务注册中心。每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号、服务版本号、通讯协议等一些附加信息。注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。

1.2 Eureka客户端

Eureka客户端,主要处理服务的注册和发现。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。

二、搭建Eureka服务端

2.1 创建主maven工程

首先创建一个主Maven工程,该工程作为所有模块的父类,用于引入springboot,起到依赖版本统一控制的作用。其他模块可以通过module的形式继承该工程,也可以将该工程打包成jar包,其他模块来依赖。本文中采用module的形式。

在其pom文件引入依赖,spring Boot版本为2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。代码如下:

<?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.moi</groupId>
    <artifactId>moi-sc-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>moi-sc-parent</name>
    <description>main project for Spring Boot</description>

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

    <modules>
        <module>eureka-server</module>
        <module>eureka-client</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>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 创建2个module工程

一个module工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client。项目右键---new---Module---maven。

创建完后的工程,其pom.xml继承了父pom文件,并引入spring-cloud-starter-netflix-eureka-server的依赖,代码如下:

2.2.1 eureka-server pom文件

<?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>moi-sc-parent</artifactId>
        <groupId>com.moi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>eureka-server</artifactId>
    <packaging>jar</packaging>
    <name>eureka-server</name>
    <description>Eureka Server SpringBoot</description>

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

</project>

2.2.2 eureka-server application启动类

需要在springboot工程的启动application类上加一个注解,@EnableEurekaServer。如下:

新建启动application类EurekaServerApplication,代码如下:

package com.moi.application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * Created by fangw on 2019/2/18.
 * SpringBootApplication注解代表该类是springboot工程的启动application类
 * EnableEurekaServer注解代表它是注册中心
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

注:不要在src/main/java下直接创建该类,否则会报错:** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.具体目录结构如下图:

2.2.3 eureka-server 配置文件

eureka-server application.yml代码如下:

server:
  #指定eureka-server的端口
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    #在默认情况下erureka server也是一个eureka client,也会往注册中心注册。下面2个注解标明它是一个server
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      #指定注册中心地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
  application:
    name: eurka-server

注:为了安全起见,注册中心是可以设置用户名和密码的,这样在客户端往中心注册时就需要进行密码验证。在springboot2.0和2.0之前加密验证操作是有区别的。如有需要,读者可自行百度。本文中并没有进行加密验证。

2.2.4 启动注册中心

运行EurekaServerApplication类,启动eurka-server工程,打开浏览器访问:
http://localhost:8761 ,界面如下:

注:目前还没有客户端实例注册。

三、搭建Eureka客户端

3.1 新建eureka_client工程。步骤同上面eureka_server创建流程。

当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。

3.1.1 eureka-client pom文件

<?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>moi-sc-parent</artifactId>
        <groupId>com.moi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>eureka-client</artifactId>
    <packaging>jar</packaging>
    <name>service-hi</name>
    <description>Eureka Client SpringBoot</description>

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

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

注:依赖spring-cloud-starter-netflix-eureka-client,标识它是一个客户端服务实例;依赖spring-boot-starter-web,标识它是一个web项目,可以发布;依赖spring-boot-starter-actuator,下文会具体讲。

3.1.2 eureka-client application启动类

需要在springboot工程的启动application类上加一个注解,@EnableEurekaClient。如下:

新建启动application类EurekaClientApplication,代码如下:

package com.moi.application;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by fangw on 2019/2/18.
 * RestController代表该类是controller,可以发布接口
 * EnableEurekaClient它是客户端服务
 */
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaClientApplication {

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

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

    @RequestMapping("/hi")
    public String home(@RequestParam(value = "name", defaultValue = "fangw") String name) {
        return "hi " + name + " ,i am from port:" + port;
    }
}

3.1.3 eureka-client 配置文件

eureka-client application.yml代码如下:

server:
  port: 8762
spring:
  application:
    name: eurka-client
  cloud:
    client:
      ipAddress: 192.168.2.81
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    #将IP注册到Eureka Server上,如果不配置就是机器的主机名
    prefer-ip-address: true
    #自定义客户端服务在Eureka Server上的实例名
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

注:这里的info就和上文说到的spring-boot-starter-actuator依赖有关。

3.1.4 启动客户端服务

运行EurekaClientApplication类,启动eurka-client工程,再次打开浏览器访问:
http://localhost:8761 ,界面如下:

注:这时就会看到有一个客户端实例已经注册到注册中心了。点击status中的192.168.2.81:8762(自定义客户端服务在Eureka Server上的实例名,如果不在application.yml上自定义,那么此处会显示主机名),页面跳转如下:

可以看到:

1、页面中返回的信息就是application.yml中info的信息。这就和spring-boot-starter-actuator依赖有关。如果不依赖spring-boot-starter-actuator,并且不配置info信息,那么点击之后跳转的页面不会输出任何信息。

2、再看地址栏中显示的IP,正好是本机的IP,也就是说实际注册到Eureka Server上的是IP。cmd查看ipconfig验证如下:

以上为SpringCloud 教程 | 第一章: 服务的注册与发现。欢迎在评论区留言,我会尽快回复~~~

最后,打波广告。微信搜索公众号"购即省",淘宝购物领券,购物即省钱。

猜你喜欢

转载自blog.csdn.net/fanguoddd/article/details/87619630
今日推荐