实用篇-Eureka注册中心

这篇具有很好参考价值的文章主要介绍了实用篇-Eureka注册中心。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、提供者与消费者

服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)

服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)

例如前面的案例中,order-service微服务是服务提供者,user-service微服务是服务消费者

思考:

如果服务A调用服务B,服务B调用服务C,那么服务B是什么角色 ?

一个服务既可以是提供者,也可以是消费者。所以服务B相对于服务A而言,服务B是提供者。服务B相对于服务C而言,服务B是消费者

二、Eureka原理分析

以上面的案例为例,order-service微服务和user-service微服务之间,服务调用出现的问题如下:

  • order-service去向user-service发送请求,使用的是硬编码,也就是 "http://localhost:8081/user/"+order.getUserId();
  • 硬编码每次修改需要重新打包
  • 如果user-service微服务(提供者)部署成了多实例,形成集群来应对并发,那么order-service微服务(消费者)硬编码到底是写哪个实例的地址
  • 即使你知道这些实例的地址,那么如何挑选其中一台实例来使用呢

Eureka原理

  • Eureka架构中,微服务角色有两类,一个是EurekaServer叫做服务端(注册中心)。作用是记录服务信息,心跳监控;一个是EurekaClient叫做客户端,也就是服务的提供者/消费者
  • 可以把注册中心理解为Key,我们的微服务项目理解为Value,Eureka理解为字典
  • 当微服务项目(例如user-service)启动时,会主动把自己(user-service微服务)的信息注册给注册中心
  • 注册到注册中心的微服务会每隔30秒,向注册中心发起心跳,证明自己还在健康运行
  • 多个微服务的话,注册中心就会有多个Value,一个Value就是一个微服务的信息,这些Value会放到一个列表里面
  • 当其它微服务(例如order-service)要使用某个微服务(例如user-service)时,这个微服务(order-service就会向注册中心去拉取对应微服务(user-service)的信息
  • 当注册中心有多个提供者(微服务),那么消费者是通过负载均衡算法,在注册中心的服务列表中挑选一个

三、搭建Eureka

步骤有三步:

1、搭建注册中心(EurekaServer)。搭建EurekaServer注册中心,也就是创建一个项目(在cloud-demo项目内部创建eureka-server项目),把这个项目做成注册中心

2、服务注册。将user-service(前面导入的服务拆分Demo)、order-service(前面导入的服务拆分Demo)都注册到eureka

3、服务发现。在order-service中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用

1. 搭建EurekaServer注册中心

第一步: 创建一个新的项目,作为独立的微服务,用于搭建Eureka,也就是在cloud-demo工程里面新建eureka-server微服务项目

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

第二步: 在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>cloud-demo</artifactId>
        <groupId>cn.itcast.demo</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-server</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <!--添加注册中心的依赖坐标-->
    <dependencies>
<!--        eureka服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

第三步: 在eureka-server微服务的src/main/java目录新建cn.itcast.eureka.EurekaApplication类,写入如下,注意加上@EnableEurekaServer注解,启动Eureka

package cn.itcast.eureka;


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

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

第四步: 在eureka-server微服务的src/main/resources目录新建File,名字为application.yml,写入如下

server:
  # 服务端口
  port: 8686

spring:
  application:
    # eureka的服务名称,因为eureka自己也是一个服务,也需要注册服务
    name: eurekaserver

eureka:
  client:
    service-url:
      # eureka的服务地址。如果有多个的话,逗号隔开
      defaultZone: http://localhost:8686/eureka

第五步: 启动eureka-server微服务。也就是运行EurekaApplication类,浏览器访问 http://localhost:8686 

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

2. 服务注册

这里我们实现把user-service和order-service注册到Eureka,只演示user-service

第一步:在user-service项目引入spring-cloud-start-netfix-eureka-client依赖,表示客户端

<!--引入Eureka客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

 第二步: 在user-service微服务的application.yml添加如下

spring:
  # Eureka相关配置
  application:
    # user的服务名称。也就是这个user-service注册到Eureka之后,这个user-service会叫什么名字
    name: userservice

eureka:
  client:
    service-url:
      # eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个user-service微服务注册给哪个Eureka
      defaultZone: http://localhost:8686/eureka

 添加完后,user-service的application.yml文件如下,注意application是spring下的配置,要写在spring的下面

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password:
    driver-class-name: com.mysql.jdbc.Driver
    # Eureka相关配置
  application:
    # user的服务名称。也就是这个user-service注册到Eureka之后,这个user-service会叫什么名字
      name: UserService
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
    
eureka:
  client:
    service-url:
      # eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个user-service微服务注册给哪个Eureka
      defaultZone: http://localhost:8686/eureka    

同理,order-service也做相同操作,只是服务名修改一下 

第三步:

启动user-service。也就是运行UserApplication类,浏览器访问 http://localhost:8686,就可以看到user-service已经添加到Eureka里面

启动order-service。也就是运行OrderApplication类,浏览器访问 http://localhost:8686,就可以看到order-service已经添加到Eureka里面

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

当运行程序出现找不到或无法加载主类,可以尝试install一下maven工程,实在不行就全部删掉重新写一遍

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

IDEA复制服务实例 

上面我们启动了一个UserService服务实例,那么我们想再启动一个UserService实例,向Eureka注册多个服务,实现如下

第一步:右键服务然后点击复制配置 

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

第二步:设置服务名称和端口

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生 第三步:启动服务

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

第四步:打开Eureka注册中心,看到UserService的服务列表中增加了一个

也就是说,UserService的服务实例可以注册多个,当消费者想要获取服务时,可以通过负载均衡策略向服务实例发起请求 

3. 服务发现

服务发现也叫服务拉取,我们需要在order-service完成服务拉取。服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡

首先回想一下,前面的远程调用,我们实现了在订单项目(也就是现在的order-service微服务)去查询用户项目(也就是现在的user-service微服务)的案例需求

当时是在order-service里面使用url请求ip地址的方式,去请求user-service,从而获取user-service的用户信息

那么,学习了上面的Eureka之后,并且我们已经把order-service和user-service注册到注册中心(eureka-server)了,所以就可以在order-service里面,通过 '服务发现' 去获取user-service里面的用户信息

具体操作也非常简单,也是使用url请求的方式,但请求的路径不是ip,而是服务名称

代码实现

第一步: 在order-server微服务中的src/main/java/cn.itcast.order/service/OrderService类,修改访问的url路径,用服务名代替ip、端口。修改为如下

package cn.itcast.order.service;

import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.sql.PreparedStatement;

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.利用RestTemplate发起http请求,查询用户
        //2.1 url路径
        String url = "http://UserService:8081/user/" + order.getUserId();
        //这个方法第一个参数是访问路径,第二个参数是把响应得到的Json数据封装成实体类对象
        User user = restTemplate.getForObject(url, User.class);
        //3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

第二步: 负载均衡。在order-server微服务中的OrderApplication引导类修改为如下,主要是给RestTemplate加上@LoadBalanced注解

package cn.itcast.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

    /**
     * 创建RestTemplate并注入Spring容器
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

第三步: 重新启动在order-server微服务的OrderApplication引导类,浏览器输入

http://localhost:8080/order/101,并向user-service微服务发送多次请求

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

实用篇-Eureka注册中心,分布式微服务,eureka,java,云原生

总结:服务发现,就是将请求url中的ip地址替换成服务名称,然后根据负载均衡策略去调用服务文章来源地址https://www.toymoban.com/news/detail-734755.html

到了这里,关于实用篇-Eureka注册中心的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>

    分布式架构的一种 把服务进行 拆分 springcloud 解决了 服务拆分过程中的 治理问题 与单体应用 进行区分 (单体架构 把业务所有功能集中开发,打成一个包部署) 每个模块独立开发和部署(服务集群) 服务之间互相调用 出现分布式技术 Webservice ESB Hession Dubbo 异步通信 消息队

    2024年02月07日
    浏览(38)
  • SpringCloud实用篇1——eureka注册中心 Ribbon负载均衡原理 nacos注册中心

    单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单;部署成本低(打jar包、部署、负载均衡就完成了) 缺点:耦合度高(维护困难、升级困难,不利于大项目开发) 分布式架构 根据业务功能对系统做拆分,每个业务功能模块作为独立

    2024年02月13日
    浏览(28)
  • 微服务Eureka注册中心

    目录 一、Eureka的结构和作用 二、搭建eureka-server 三、服务注册 四、服务发现 假如我们的服务提供者user-service部署了多个实例,如图: 存在的问题: order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口? 有多个user-service实例地址,order-service调用时该如

    2024年02月13日
    浏览(37)
  • 微服务—Eureka注册中心

           eureka相当于是一个公司的管理人事HR,各部门之间如果有合作时,由HR进行人员的分配以及调度,具体选哪个人,全凭HR的心情,如果你这个部门存在没有意义,直接把你这个部门撤销,全体人员裁掉,所以不想被裁员,只能每天拼命的工作,做一个累死累活的打工人

    2024年02月12日
    浏览(25)
  • 服务注册中心 Eureka

    服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件,本身是一个基于 REST 的服务。提供 注册与发现 ,同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心(Eureka Server):服务器端。它提供服务的注册和发现功能,即实现服务的治理。 服

    2024年02月11日
    浏览(40)
  • 【微服务】Eureka注册中心

    我们在前文的案例中,我们采取如下的方式发送http请求: 我们将user-service的ip地址和端口硬编码在了代码当中,这样的写法是有一定问题的。我们在公司开发中,可能会面临多个环境,开发环境、测试环境等等,每一次环境的变更可能服务的地址也会发生变化,使用硬编码显

    2024年01月15日
    浏览(27)
  • 1.2 eureka注册中心,完成服务注册

    目录 环境搭建 搭建eureka服务 导入eureka服务端依赖 编写启动类,添加@EnableEurekaServer注解 编写eureka配置文件 启动服务,访问eureka Euraka服务注册 创建了两个子模块 在模块里导入rureka客户端依赖  编写eureka配置文件 添加Services 创建父工程,父工程中导入spring cloud的依赖,用来统

    2024年02月14日
    浏览(30)
  • 分布式事务Seata实战-AT模式(注册中心为Eureka)

    大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。 官网:Seata AT 模式 | Apache Seata™ 官方代码示例:   快速启动 | Apache Seata™ 此文章涉及的项目代码链接:seata-at: 分布式事务解

    2024年01月19日
    浏览(34)
  • SpringCloud:Eureka服务注册中心

    Eureka是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。 在搭建微服务项目时遇到的三个问题: 服务消费者该如何获取服务提供者的地址信息? 如果有多个服务提供者,消费者该如何选择? 消费者如何得知服务提供者的健康状态? Eureka的作

    2024年01月20日
    浏览(26)
  • 微服务学习 Eureka注册中心

    服务调用时候出现问题,当服务者很多时候,比如不同的端口。消费者如何找到服务者的地址?又如何判断服务者是否健康。 Eureka基本原理: 总结:如果有多个服务提供者,消费者该如何选择? 搭建Eureka注册中心: 1.引入依赖 2.编写启动类,添加@EnableEurekaServer注解 这里在启动

    2024年04月16日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包