springcloud:服务治理——springcloudeureka(代码片段)

fengweiweicoder fengweiweicoder     2022-12-20     372

关键词:

  服务治理是微服务架构中最为核心和基础的模块,主要作用是实现各个微服务实例的自动化注册和发现。Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,基于Netflix EureKa做了二次封装,主要负责微服务架构中的服务治理功能。

  Eureka的服务发现包含两大组件,服务端发现组件(Eureka Server)和客户端发现组件(Eureka Client)。服务端发现组件也被称为服务注册中心,主要提供了服务的注册功能,客户端发现组件主要用于处理服务的注册与发现。按照角色分类,在Eureka中,服务发现机制包含3个角色:服务注册中心,服务提供者以及服务消费者。

一、使用Eureka注册服务

  1. 创建maven父工程

  创建一个maven父工程,命名为  springcloud-eureka-parent ,并在工程的pom.xml中添加Spring Cloud的版本依赖信息:

<?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.fix</groupId>
    <artifactId>springcloud-eureka-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--父依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
    </parent>
    <!--编码以及Java版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!--Spring Boot包含的Maven插件,可以将项目打包成可以执行的Jar文件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

  2. 搭建服务注册中心

  在父工程 springcloud-eureka-parent 中,创建Maven子模块 springcloud-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">
    <parent>
        <artifactId>springcloud-eureka-parent</artifactId>
        <groupId>com.fix</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-eureka-server</artifactId>

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

  创建配置文件application.yml,在配置文件中增加端口号等配置信息,内容如下:

server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone:
        http://$eureka.instance.hostname:$server.port/eureka/

  以上配置表示eureka注册中心的端口号为8761,所有服务的实例都要向此端口注册。 eureka.instance.hostname 表示该eureka注册中心的实例名称为localhost, register-with-eureka:false 表示该Spring Boot应用为注册中心,不需要注册中心注册自己。 fetch-registry: false 的配置是因为注册中心的职责是维护服务实例,并不需要去检索服务。而 defaultZone 的地址是注册中心的地址。

  接着,创建项目启动类,并添加 @EnableEurekaServer 注解,用于声明该标注类是一个Erueka Server:

package com.fix.springcloud.eureka;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain 
    public static void main(String [] args)
        SpringApplication.run(EurekaServerMain.class,args);
    

  启动 springcloud-eureka-server 模块,在浏览器访问:http://localhost:8761/ 可以看到Eureka的信息面板:

技术图片

此时“Instances currently registered with Eureka”中显示当前已经注册到Eureka的服务实例为空。

  3.搭建客户端工程

  在父工程  springcloud-eureka-parent  中,创建Maven子模块  springcloud-eureka-user  作为客户端工程,在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">
<parent>
<artifactId>springcloud-eureka-parent</artifactId>
<groupId>com.fix</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>springcloud-eureka-user</artifactId>
<dependencies>
     <!--Finchley,Greenwich版本的spring cloud,创建客户端工程的时候需要引入该依赖--> 

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

</project>

  创建application.yml配置文件,在配置文件中配置Eureka服务实例的端口号,服务端地址等信息,如下:

server:
port: 8000
eureka:
instance:
prefer-ip-address: true #是否显示主机的Ip
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #指定eureka服务端地址
spring:
application:
name: springcloud-eureka-user

  创建客户端引导类 EurekaUserMain ,并添加 @EnableEurekaClient 注解用于声明标注类是一个Eureka客户端组件。具体内容如下:

@SpringBootApplication
@EnableEurekaClient
public class EurekaUserMain 
    public static void main(String[] args) 
        SpringApplication.run(EurekaUserMain.class, args);
    

  启动 springcloud-eureka-server 模块之后,启动 springcloud-eureka-user 模块,再次访问http://localhost:8761/ ,可以看到在“Instances currently registered with Eureka”中出现了刚才创建的 SPRINGCLOUD-EUREKA-USER 实例:

技术图片

  同时,可以看到该页面有红色的字体提示“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.server.enable-self-preservation=false 参数来关闭保护机制。

二、使用Eureka实现服务间的调用

  在上一步中,已经将用户服务 springcloud-eureka-user 注册到了服务注册中心,接下来将创建一个订单服务,并实现用户服务和订单服务之间的调用。

  1. 搭建订单服务工程

  在父工程 springcloud-eureka-parent 中,创建子模块 springcloud-eureka-order ,pom.xml文件和 springcloud-eureka-user 的类似,具体内容如下:

<?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>springcloud-eureka-parent</artifactId>
        <groupId>com.fix</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-eureka-order</artifactId>
    <dependencies>
        <!--Finchley,Greenwich版本的spring cloud,创建客户端工程的时候需要引入该依赖-->
        <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>
</project>

  创建配置文件 application.yml ,配置Eureka服务实例的端口号,服务注册中心地址等信息,具体内容如下:

server:
  port: 7900
eureka:
  instance:
    prefer-ip-address: true     #是否显示主机的Ip
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/     #指定eureka服务端地址
spring:
  application:
    name: springcloud-eureka-order    #指定应用名称

  创建客户端引导类 EurekaOrderMain :

@SpringBootApplication
@EnableEurekaClient
public class EurekaOrderMain 
    public static void main(String[] args) 
        SpringApplication.run(EurekaOrderMain.class, args);
    

  创建订单实体类:

package com.fix.springcloud.eureka.pojo;

public class Order 
    private String id;
    private Double price;
    private String receiverName;
    private String receiverAddress;
    private String receiverPhone;

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public Double getPrice() 
        return price;
    

    public void setPrice(Double price) 
        this.price = price;
    

    public String getReceiverName() 
        return receiverName;
    

    public void setReceiverName(String receiverName) 
        this.receiverName = receiverName;
    

    public String getReceiverAddress() 
        return receiverAddress;
    

    public void setReceiverAddress(String receiverAddress) 
        this.receiverAddress = receiverAddress;
    

    public String getReceiverPhone() 
        return receiverPhone;
    

    public void setReceiverPhone(String receiverPhone) 
        this.receiverPhone = receiverPhone;
    

    @Override
    public String toString() 
        return "Order" +
                "id=‘" + id + \\‘ +
                ", price=" + price +
                ", receiverName=‘" + receiverName + \\‘ +
                ", receiverAddress=‘" + receiverAddress + \\‘ +
                ", receiverPhone=‘" + receiverPhone + \\‘ +
                ;
    

  创建订单Controller,内容如下:

package com.fix.springcloud.eureka.controller;

import com.fix.springcloud.eureka.pojo.Order;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController 
    /**
     * 通过订单id查询订单信息
     * @param id 订单id
     * @return 订单详情
     */
    @GetMapping("/order/id")
    public String findOrderById(@PathVariable String id)
        Order order =new Order();
        order.setId("123");
        order.setPrice(200.50);
        order.setReceiverName("张三");
        order.setReceiverAddress("陕西西安");
        order.setReceiverPhone("123456799");
        return order.toString();
    

  2. 编写用户服务功能

  在 springcloud-eureka-user 实例工程的引导类中,创建 RestTemplate 的Spring实例,代码如下:

@SpringBootApplication
@EnableEurekaClient
public class EurekaUserMain 
    public static void main(String[] args) 
        SpringApplication.run(EurekaUserMain.class, args);
    

    @Bean
    public RestTemplate initRestTemplate()
        return new RestTemplate();
    

  创建用户Controller,调用订单Controller接口,查询订单信息,具体代码如下:

package com.fix.springcloud.eureka.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController 
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/findOrderByUser/id")
    public String findOrderByUser(@PathVariable String id) 
        int orderId = 123;
        return this.restTemplate.getForObject("http://localhost:7900/order/" + orderId, String.class);
    

  3.启动各Eureka实例进行测试

   依次启动服务注册中心, springcloud-eureka-order 以及 springcloud-eureka-user 实例,访问注册中心管理界面 http://localhost:8761/ 确认两个服务实例已经注册成功:

技术图片

  访问 springcloud-eureka-user 实例的接口接口 http://localhost:8000/findOrderByUser/123,可以看到有数据正常返回:

技术图片

  表示使用Eureka进行服务间接口调用成功。

微服务之springcloud实战:springcloudeureka服务治理

服务治理  SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,它基于NetflixEureka做了二次封装,主要完成微服务的服务治理功能,SpringCloud通过为Eureka增加了SpringBoot自动化配置,只需要简单的依赖和配置就可完成Eureka整合搭建... 查看详情

从天气项目看springcloud微服务治理

Java视频教程详情描述: 《从天气项目看SpringCloud微服务治理》从SpringBoot入手,从0到1快速搭建具备高并发能力、界面友好,业务便于理解的天气预报系统,而后剖析单块架构的利弊,从而引入微服务架构的概念,并从1到0实... 查看详情

基于springcloud的微服务构建学习-3服务治理:springcloudeureka

基于SpringCloud的微服务构建学习-3服务治理:SpringCloudEureka什么是服务治理  服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现。为什么需要服务治理模块  在最初构... 查看详情

springcloud:服务治理——springcloudeureka(代码片段)

...,主要作用是实现各个微服务实例的自动化注册和发现。SpringCloudEureka是SpringCloudNetflix微服务套件中的一部分,基于NetflixEureKa做了二次封装,主要负责微服务架构中的服务治理功能。  Eureka的服务发现包含两大组件,服务端发... 查看详情

《springcloud从入门到入土》第3章:服务治理:springcloudeureka

简介:SpringCloudEureka是SpringCloudNetflix微服务套件中的一部分,他基于NetflixEureka做了二次封装,主要负责完成微服务架构中的服务治理功能。SpringCloud通过为Eureka增加了SpringBoot风格的自动化配置,我们只需通过引入简单的依赖和注... 查看详情

springcloud——服务治理中心eureka

...,它提供了完整的ServiceRegistry和ServiceDiscovery实现。也是springcloud体系中最重要最核心的组件之一。Eureka服务中心又称注册中心,管理着各个服务包括服务注册、服务发 查看详情

从天气项目看springcloud微服务治理

网上搜集的资源,个人感觉还行,分享了从天气项目看SpringCloud微服务治理网盘地址:https://pan.baidu.com/s/1ggn5uld密码:n6bn备用地址(腾讯微云):https://share.weiyun.com/7a101b0864bc027c9c1d2605e0012472密码:s5CApH 查看详情

springcloud系列之服务治理eureka(代码片段)

...源的基于REST服务的注册中心,用于提供服务发现功能。SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,基于NetflixEureka进行了二次封装,主要负责完成微服务架构中的服务治理功能。SpringCloudEureka是一个基于REST的服务,并提... 查看详情

springcloud----服务注册中心eureka

...用来实现各个微服务实例的自动化注册和发现。  SpringCloudEureka是SpringCloudNetflix微服务套件中的一部分,它基于NetflixEureka做了二次封装。主要负责完成微服务架构中的服务治理功能。Eureka服务治理体系如下:1.2服务 查看详情

微服务架构下的服务治理:如何在springcloud框架中实现服务的注册与发现

...发现注册中心在RPC远程过程调用协议中,有一个注册中心SpringCloud支持三种组册中 查看详情

从天气项目看springcloud微服务治理

...m/7a101b0864bc027c9c1d2605e0012472密码:s5CApH本课程基于SpringBoot+SpringCloud技术栈来实现一个完整的天气预报系统。在课程中,先从SpringBoot入手,从0到1快速搭建了具备高并发 查看详情

springcloud之eureka服务治理机制及代码运行

     服务提供者服务注册:服务提供者在启动的时候通过发送Rest请求的方式将自己注册到EurekaServer上,同时带上了自身服务的一些元数据信息。EurekaServer在收到这个请求后,将元数据信息存储在一个双层结构Map中... 查看详情

springcloudvsistio微服务治理框架对比

目前主流的微服务治理框架主要是SpringCloud。而Istio作为新一代微服务框架,越来越受到关注。Istio被引入的主要原因是传统微服务存在以下问题。多语言技术栈不统一:C++、Java、PHP、Go。SpringCloud无法提出非Java语言的微服务治理... 查看详情

springcloud--eureka服务治理深入浅出(代码片段)

文章目录什么是服务治理Eureka调用过程Eureka单机注册Eureka单机启动单机注册集群注册客户调用Eureka集群注册idea如何同一个项目启动多次Eureka自我保护为什么要自我保护如何开启自我保护自我保护如何激活上述源码分布式是现在... 查看详情

springcloud构建微服务架构:服务消费(基础)

使用LoadBalancerClient在SpringCloudCommons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介绍服务注册与发现时已经说过,SpringCloud做这一层抽象... 查看详情

构建微服务架构springcloud:服务消费(基础)

使用LoadBalancerClient在SpringCloudCommons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介绍服务注册与发现时已经说过,SpringCloud做这一层抽象... 查看详情

构建微服务架构springcloud:服务消费(基础)

使用LoadBalancerClient在SpringCloudCommons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介绍服务注册与发现时已经说过,SpringCloud做这一层抽象... 查看详情

eureka----springcloud微服务

服务治理SpringCloudEureka 什么是服务治理在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。服... 查看详情