欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud 学习笔记01 服务注册与发现

程序员文章站 2022-07-13 08:36:38
...

一、Spring Cloud简介

SpringCloud 学习笔记01 服务注册与发现

二、创建服务注册中心

采用Eureka作为服务注册与发现的组件

首先创建一个maven主工程 两个子工程一个model工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client。

在其父pom文件引入依赖,spring Boot版本为2.1.5.RELEASE,Spring Cloud版本为Greenwich.RELEASE。后面同系列文章其父pom文件与其保持一致。

父pom文件起到依赖版本控制的作用,其他module工程继承该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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xdarker</groupId>
  <artifactId>sc-demo1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>sc-demo1</name>

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


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

  <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>Greenwich.RELEASE</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

  </dependencies>

  <!--只是对版本进行管理,不会实际引入jar-->
  <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 Server pom.xml继承了父pom文件,并引入spring-cloud-starter-netflix-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>sc-demo1</artifactId>
        <groupId>com.xdarker</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-server</artifactId>
    <packaging>jar</packaging>
    <name>eureka-server</name>

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

    </dependencies>

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

启动一个服务注册中心,只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上加:

package com.xdarker;

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

/**
 * Hello world!
 *
 */
@SpringBootApplication
//启动一个服务注册中心
@EnableEurekaServer
public class EurekaServerApplication
{
    public static void main( String[] args )
    {
       SpringApplication.run(EurekaServerApplication.class,args);
    }
}

eureka server的配置文件appication.yml:

eureka:
   client:
      #此客户端是否获取eureka服务器注册表上的注册信息,默认为true
      fetch-registry: false
      #实例是否在eureka服务器上注册自己的信息以提供其他服务发现,默认为true
      register-with-eureka: false
   instance:
      hostname: localhost
server:
   port: 11000
spring:
   application:
      name: eureka-server

eureka server 是有界面的,启动工程,打开浏览器访问:http://localhost:11000,界面如下:

SpringCloud 学习笔记01 服务注册与发现

三、创建一个服务提供者 (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>sc-demo1</artifactId>
        <groupId>com.xdarker</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-hi</artifactId>
    <packaging>jar</packaging>

    <name>service-hi</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <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>

    </dependencies>

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

通过注解@EnableDiscoveryClient 表明自己是一个eurekaclient

package com.xdarker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@EnableDiscoveryClient
//@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
//不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
public class Application
{
    public static void main( String[] args )
    {
        SpringApplication.run(Application.class,args);
    }
}

Controller类

package com.xdarker.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 文件名称:ServiceHiController
 * 本类描述:
 * 日期:2019/5/27 11:16
 *
 * @author XDrker
 * @version 1.0
 */
@RestController
public class ServiceHiController {

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

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

}

在配置文件中注明自己的服务注册中心的地址,application.yml配置文件如下:

eureka:
    client:
        serviceUrl:
#        eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置
            defaultZone: http://localhost:11000/eureka/
server:
    port: 12001
spring:
    application:
        name: service-hi

需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
启动工程,打开http://localhost:12001 ,即eureka server 的网址:

SpringCloud 学习笔记01 服务注册与发现

你会发现一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为12001

这时打开 http://localhost:8762/hi?name=XDrker ,你会在浏览器上看到 :

SpringCloud 学习笔记01 服务注册与发现

问题:将客户端关闭后,再次打开Eureka的注册页面,发现有一串红字:

SpringCloud 学习笔记01 服务注册与发现

Eureka的自我保护模式

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;

这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。

 

参考博客:方志朋