SpringCloud全家桶 (第一期:服务注册与服务发现)

本文详细介绍SpringCloud作为微服务架构的重要工具,涵盖服务发现、保护模式等核心概念。通过实例演示如何创建注册中心和发现服务,深入解析EurekaServer的工作原理及配置,帮助读者快速掌握SpringCloud微服务构建技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: 什么是SpringCloud

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

翻译如下

Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。

SpringCloud主要框架

二:创建注册中心

1.先创建一个maven项目:如下
在这里插入图片描述
直接下一步即可
在这里插入图片描述

2,创建一个eureka(注册中心)项目:
在这里插入图片描述

选择Spring Initializr ,点击next

在这里插入图片描述
选择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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ml</groupId>
    <artifactId>m_eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>m_eureka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </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>

创建一个application.yml文件,加入以下配置

server:
  port: 8761

spring:
  profiles:
    active: dev  # 指定环境(可省略)
  application:
    name: eureka   # 服务名称(各服务之间调用会用到)

    
eureka:
  instance:
    #注册中心服务的主机,默认是localhost
    hostname: localhost
  client:
    #是否将当前微服务注册到Eureka服务中。自己是注册中心,因此无需注册。在搭建 Eureka Server 双节点或集群的时候,要把 eureka.client.register-with-eureka 和 eureka.client.fetch-registry 均改为 true(默认)。
    register-with-eureka: false
    #是否从Eureka中获取注册信息。自己是注册中心,因此无需获取。
    fetch-registry: false
    #Eureka客户端与与Eureka服务端进行交互的地址Map表
    service-url:
      #默认http://localhost:8761/eureka/
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

eureka中自带的有注册中心页面,加入@EnableEurekaServer注解,开启Eureka服务,如图:
在这里插入图片描述
eureka server集群配置

启动后,访问http://127.0.0.1:8761,进入注册中心:
在这里插入图片描述

三:创建服务发现

1.创建discovery项目,如图:
在这里插入图片描述
2,步骤和eureka类似,选择Eureka Discovery 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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ml</groupId>
    <artifactId>discovery</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>discovery</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </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>
        <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>

创建application.yml,加入以下配置

server:
  port: 8086

spring:
  profiles:
   active: dev  # 指定环境(可省略)
  application:
    name: discovery   # 服务名称(各服务之间调用会用到)
   # 以上配置跟eureka没什么区别

eureka:
  client:
    #Eureka服务的地址
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    #用于表示在猜测主机名时,服务器的IP地址应该与操作系统报告的主机名相对应。(注册服务和客户端如果在一台机器上则无需配置)
    prefer-ip-address: true

加完配置后,还需要在启动类上加上注解@EnableDiscoveryClient
在这里插入图片描述

package com.ml.discovery;

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

@SpringBootApplication
@EnableEurekaClient //可以省略,因为pom中引入spring-cloud-starter-netflix-eureka-client,就会被默认当做客户端
@EnableDiscoveryClient //开启服务发现
public class DiscoveryApplication {

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

}

启动discovery服务,咱们再看下有没有注册到eureka注册中心上呢??答案:如下图

在这里插入图片描述

四:保护模式

停掉其中的某服务,再默认等待1分钟,注册实例列表的上方会出现红色的字体提示,内容为:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式。

解释如下:

Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。

【了解】

关闭保护模式(如无特殊需要,不建议):

Eureka server的application.yml

eureka:  
  server:  
  	#是否开启安全保护,默认是true开启。
    enableSelfPreservation: false  
    #清理间隔(单位毫秒,默认是60*1000)
    eviction-interval-timer-in-ms: 6000

微服务的application.yml

eureka:  
  instance:
  	#租期更新时间间隔(默认30秒)
    leaseRenewalIntervalInSeconds: 10  
    #租期到期时间(默认90秒)
    leaseExpirationDurationInSeconds: 30  

SpringCloud文档点击查看

开心一刻
一天晚上,妈妈哄她10岁的儿子独自到他自己的房里睡觉,小家伙就是要妈妈陪着睡,无奈的妈妈就说“你羞不羞,这么大的人还要妈妈陪着睡!”

“爸爸不是更大了还要你天天陪着睡!”儿子理直气壮地说。

在这里插入图片描述
如果觉得不错,帮忙点个赞,您的点赞将是我的动力!

下一篇:Feign的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值