【spring cloud 第一篇】eureka简介及demo

1 eureka简介

1.1 什么是eureka

  • 和consul、zookeeper类似,eureka是一个用户服务注册和发现的组件
  • eureka分为eureka server和eureka client,eureka server是eureka服务注册中心,eureka client是eureka客户端

1.2 为什么选择eureka

在spring cloud中,可选择consul、zookeeper作为服务注册和发现,那为什么要选择eureka

  • eureka完全开源,是Netflix公司的开源产品,经历了Netflix公司的生产环境的考验
  • eureka和其他组件(负载均衡组件Ribbon、熔断器组件hystrix、熔断器监控组件hystrix dashboard、熔断器聚合监控turbine组件、以及网关zuul组件)相互配合,能够很容易实现服务注册、负载均衡、熔断和智能路由等功能。

1.3 eureka的基础架构

如下图:eureka的基础架构主要包括一下3种角色:

  • register service: 服务注册中心,它是Eureka Server,提供服务注册和发现的功能。
  • provider service: 服务提供者,它是Eureka Client,提供服务。
  • consumer service: 服务消费者,它也是Eureka Client,消费服务
    在这里插入图片描述

服务消费过程:

  • 1 首先需要一个服务注册中心eureka Server,服务提供者eureka client向服务注册中心eureka server注册,将自己的信息(服务名、服务的IP地址等)通过REST API的形式提交给服务注册中心eureka server;
  • 2 同样,服务消费者eureka client也向服务注册中心eureka server注册,同时服务消费者获取一份服务注册列表的信息,这样服务消费者就知道服务提供者的IP地址,可以通过HTTP远程调度来消费服务提供者的服务

1.4 eureka概念

1.4.1 register - 服务注册

当eureka client想eureka server注册时,eureka client提供自身的元数据,比如IP地址,端口、运行状况指标的url、主页地址等信息。

1.4.2 renew - 服务续约

eureka client在默认情况下每个30秒发送一次心跳进行服务续约。通过服务续约来告知eureka server 该eureka client任然可用;如果eureka server90秒没有收到eureka client的心跳,eureka server会将eureka client实例从注册列表删除。(官网不建议更改服务续约的间隔时间)

1.4.3 fetch registries - 获取服务注册列表信息

eureka client从 eureka server获取服务注册表信息,并将其缓存在本地。eureka client使用JSON格式来获取服务注册列表信息

1.4.4 cancel - 服务下线

eureka client在程序关闭是可以向eureka server发送下线请求。eureka server收到请求将其从服务注册列表中删除。该下线请求不会自动完成,需要在程序关闭时调用一下代码:

DiscoveryManager.getInstance().shutdownComponent();

1.4.5 服务剔除

默认情况下,当eureka client联系90秒没有eureka server发送服务续约(即心跳)时,eureka server会将该服务实例从服务注册列表删除,即服务剔除。

编写eureka demo

构建maven多module的结构

  • IDEA 构建 可参考:https://blog.csdn.net/qiaziliping/article/details/105866892
  • 结构如下
    在这里插入图片描述
    eureka-master的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qgg</groupId>
    <artifactId>eureka-master</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-master</name>
    <packaging>pom</packaging>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </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-could.version>Dalston.SR1</spring-could.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-could.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.qgg</groupId>
        <artifactId>eureka-master</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

    <dependencies>
        <!-- eureka-server起步依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!--springboot测试起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>-->

    </dependencies>

    <build>
        <!--springboot的maven插件,即可使用maven插件的方式来启动springboot工程-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • application.yml配置文件
    在默认情况下,eureka server会向自己注册,需要配置eureka.client.registerWithEureka和eureka.client.fetchRegistry为false,防止自己向自己注册
server:
  port: 8761 # 指定eureka server的端口为8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false  # 客户端注册
    fetch-registry: false        # 客户端获取注册表
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #试了,两种方式都可以
      # DEFAULT_ZONE: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enable-self-preservation: false  #关闭eureka-server的自我保护机制,默认为true
  • EurekaServerApplication.java 启动文件
    通过@EnableEurekaServer开启eureka server的功能
package com.qgg.eurekaserver;

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

@SpringBootApplication //
@EnableEurekaServer  // 开启eureka server的功能
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  • eureka-server启动完成如下图
    访问:http://localhost:8761/
    在这里插入图片描述

eureka-client

结构图如下:
在这里插入图片描述

  • pom.xml文件如下
    eureka client客户端所需的依赖 spring-cloud-starter-eureka,
    因为web功能的起步依赖spring-boot-starter-web,以及spring boot测试的起步依赖spring-boot-starter-test
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.qgg</groupId>
        <artifactId>eureka-master</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <artifactId>eureka-client</artifactId>
    <name>eureka-client</name>

    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.1.RELEASE</version>
        </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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

  • application.yml配置文件
    配置eureka-client的程序端口为8762
    服务注册地址为http://localhost:8761/eureka/
    程序名称为eureka-client22
server:
  port: 8762   #eureka-client的程序端口

eureka:
  client:
    service-url:
      DEFAULT_ZONE: http://localhost:8761/eureka/  # 服务注册地址

spring:
  application:
    name: eureka-client22   # 程序名称
  • EurekaClientApplication.java 启动文件
    通过@EnableEurekaClient开启eureka client的功能
package com.qgg.eurekaclient;

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

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

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

}
  • HiController.java 控制类
    编写一个控制类,并通过@Value("${}")注解获取获取应用的端口号,在接口中返回该端口号
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HiController {

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

    @GetMapping(value = "/getPort/{name}")
    public String helloPort(@PathVariable String name) {
        return name+"-"+port;
    }
}
  • eureka client启动完成如图
    启动打印 如下log表示注册成功
 DiscoveryClient_EUREKA-CLIENT22/liping-pc.diag.launch:eureka-client22:8762 - registration status: 204

重新刷新http://localhost:8761/,显示实例application为EUREKA-CLIENT22,status为UP(在线),端口为8762
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我来为你介绍一下Spring Cloud微服务之间调用接口的Demo。 首先,我们需要创建一个Eureka Server,用于服务的注册与发现。可以使用Spring Cloud提供的`@EnableEurekaServer`注解来实现。 其次,我们需要创建两个微服务,分别为`service-provider`和`service-consumer`。其中,`service-provider`提供一个接口用于返回当前时间,`service-consumer`通过调用`service-provider`的接口获取当前时间并返回给客户端。 接下来,我们来看一下具体的实现步骤: 1. 创建Eureka Server 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ``` 在启动类上增加`@EnableEurekaServer`注解,示例代码如下: ```java @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } ``` 2. 创建service-provider微服务 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` 在application.properties文件中配置Eureka Server的地址: ``` eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ ``` 创建提供当前时间的接口,示例代码如下: ```java @RestController public class TimeController { @GetMapping("/time") public String getTime() { return LocalDateTime.now().toString(); } } ``` 3. 创建service-consumer微服务 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` 在application.properties文件中配置Eureka Server的地址: ``` eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ ``` 创建调用service-provider接口的方法,示例代码如下: ```java @RestController public class TimeController { @Autowired private RestTemplate restTemplate; @GetMapping("/time") public String getTime() { String url = "http://service-provider/time"; String result = restTemplate.getForObject(url, String.class); return result; } } ``` 最后,启动Eureka Server、service-provider和service-consumer微服务,通过service-consumer的接口访问即可获得当前时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值