SpringCloud-Eureka注册中心

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

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

🍁博客主页:👉@不会压弯的小飞侠
欢迎关注:👉点赞👍收藏留言
系列专栏:👉SpringCloud专栏
知足上进,不负野心。
🔥欢迎大佬指正,一起学习!一起加油!

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务


🍁服务拆分及远程调用

🔥服务拆分

  • 服务拆分注意事项
    • 1.单一职责:不同微服务,不要重复开发相同业务
    • 2.数据独立:不要访问其它微服务的数据库
    • 3.面向服务︰将自己的业务暴露为接口,供其它微服务调用

准备工作,创建一个Cloud-demo项目工程。

  • 实现功能
    • order-service根据id查询订单
    • order-user根据id查询用户
  • 项目结构

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • sql导入数据库
  • cloud-order.sql
CREATE TABLE `tb_order`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',
  `price` bigint(20) NOT NULL COMMENT '商品价格',
  `num` int(10) NULL DEFAULT 0 COMMENT '商品数量',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `tb_order` VALUES (101, 1, 'Apple 苹果 iPhone 12 ', 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新国标电动车', 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, '骆驼(CAMEL)休闲运动鞋女', 43900, 1);
INSERT INTO `tb_order` VALUES (104, 4, '小米10 双模5G 骁龙865', 359900, 1);
INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 双模5G 视频双防抖', 299900, 1);
INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷静星II ', 544900, 1);
INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人体工学电脑椅子', 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休闲男鞋', 31900, 1);

  • cloud-user.sql
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `tb_user` VALUES (1, '柳岩', '湖南省衡阳市');
INSERT INTO `tb_user` VALUES (2, '文二狗', '陕西省西安市');
INSERT INTO `tb_user` VALUES (3, '华沉鱼', '湖北省十堰市');
INSERT INTO `tb_user` VALUES (4, '张必沉', '天津市');
INSERT INTO `tb_user` VALUES (5, '郑爽爽', '辽宁省沈阳市大东区');
INSERT INTO `tb_user` VALUES (6, '范兵兵', '山东省青岛市');

  • order-service具体代码如下:

order实体类

@Data
public class Order {
    private Long id;
    private Long price;
    private String name;
    private Integer num;
    private Long userId;
    private User user;
}

user实体类

@Data
public class User {
    private Long id;
    private String username;
    private String address;
}

OrderMapper接口

public interface OrderMapper {
    @Select("select * from tb_order where id = #{id}")
    Order findById(Long id);
}

OrderService

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 4.返回
        return order;
    }
}

OrderApplication

@MapperScan("cn.study.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

application.yml

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/could_order?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.study.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.study: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

user-service项目的创建就不过多描述,跟order-service项目大致一样。
启动项目,进行测试:
SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务
SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

🔥服务远程调用

  • 需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回
  • 如何在java代码中发送http请求
  • 步骤

1.注册RestTemplate

  • 在order-service的OrderApplication中注册RestTemplate并注入spring容器
package cn.study.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("cn.study.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

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


}

2.服务远程调用RestTemplate

  • 修改order-service中的OrderService的queryOrderByld方法
package cn.study.order.service;

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

@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.1URL路径
        String url="http://localhost:8081/user/"+order.getUserId();
        //2.2发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        //3.封装user到order
        order.setUser(user);
        // 4.返回
        return order;
    }
}


  • 重启order微服务
  • http://localhost:8080/order/101
  • 实现了跨服务调用

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • 微服务调用方式
    • 基于RestTemplate发起的http请求实现远程调用
    • http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。

🍁Eureka注册中心

Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。

  • 服务调用关系
    • 服务提供者:暴露接口给其它微服务调用
    • 服务消费者:调用其它微服务提供的接口
    • 提供者与消费者角色其实是相对的
    • 一个服务可以同时是服务提供者和服务消费者

🔥 服务调用出现的问题

  • 服务消费者该如何获取服务提供者的地址信息?
  • 如果有多个服务提供者,消费者该如何选择?
  • 消费者如何得知服务提供者的健康状态?
    SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

🔥eureka的作用

  • Eureka有两个角色:
    • 一个是服务端:eureka-server,注册中心,负责记录和管理微服务
    • 一个是客户端:eureka-client,包括提供者和消费者,在前面的demo中,包含user和order。
  • 提供者user现在有三台服务器部署(用三个端口号代替),分别是8081、8082、8083,order只有一台服务器部署,8080,先在eureka的服务端进行服务信息的注册,每次当order请求的时候,eureka服务端都会把user的ip地址拉取下来给order,消费者利用负载均衡算法,从服务列表挑选一个,进行远程调用。

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • 消费者该如何获取服务提供者具体信息?
    • 服务提供者启动时向eureka注册自己的信息eureka保存这些信息
    • 消费者根据服务名称向eureka拉取提供者信息
  • 如果有多个服务提供者,消费者该如何选择?
    • 服务消费者利用负载均衡算法,从服务列表中挑选一个
  • 消费者如何感知服务提供者健康状态?
    • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态eureka会更新记录服务列表信息,心跳不正常会被剔除
    • 消费者就可以拉取到最新的信息

总结:

  • 在Eureka架构中,微服务角色有两类:
    • EurekaServer:服务端,注册中心
      • 记录服务信息
      • 心跳监控
  • EurekaClient:客户端
    • Provider:服务提供者,例如案例中的user-service
      • 注册自己的信息到EurekaServer
      • 每隔30秒向EurekaServer发送心跳
    • consumer:服务消费者,例如案例中的order-service
      • 根据服务名称从EurekaServer拉取服务列表
      • 基于服务列表做负载均衡,选中一个微服务后发起远程调用

🔥搭建Eureka服务

  • 创建项目,引入spring-cloud-starter-netflix-eureka-server的依赖
<dependencies>
        <!--eureka服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
  • 编写启动类,添加@EnableEurekaServer注解
package cn.study.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);
    }
}

  • 添加application.yml文件,编写下面的配置:
#服务端口
server:
  port: 8083
#服务名称
spring:
  application:
    name: eurekaservice
#eureka地址信息
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8083/eureka

注意因为eureka也是一个微服务,所以要配置eureka的地址信息,将它自己也注册到eureka上。

启动eureka服务器,点击端口号8083直接访问浏览器
SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • EUREKASERVER是服务的名称
  • Status是服务的状态
  • UP表示正常
  • DOWN表示宕机
  • DESKTOP-OK3TT7Q是计算机名

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

🔥注册user-service

  • 将user-service服务注册到EurekaServer步骤如下:

  • 1.在user-service项目引入spring-cloud-starter-netflix-eureka-client的依赖

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

  • 2.在application.yml文件,编写下面的配置:
spring:
   application:
     name: userservice  #userservice的服务名称
# 注册服务到eureka上
eureka:
  client:
    service-url:
      # eureka的地址信息,注册到 eureka 上
      defaultZone: http://127.0.0.1:8083/eureka

注意:发现爆红,原因是yml中不能出现两段spring,合并就Ok了。

  • 重启这三个服务,访问eureka查看注册进来的服务

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

将order-service服务注册到EurekaServer步骤如上,这里就不过多叙述了。

🔥模拟启动两个user-service

将user-service多次启动,模拟多实例部署,但为了避免端口冲突,需要修改端口设置:

  • 1.选中UserApplication,右键–>Copy Configuration服务复制配置

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • 2.更改服务名称,写上-Dserver.port=8082,注意避开端口冲突

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • 3.启动UserApplication2服务

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • 4.重新访问eureka,可以看到user-service有两个端口

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

🔥eureka服务发现-服务拉取

  • 在eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。

  • 1.修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口

package cn.study.order.service;

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

@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.1URL路径
       /* String url="http://localhost:8081/user/"+order.getUserId();*/
        String url="http://userservice/user/"+order.getUserId();
        //2.2发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        //3.封装user到order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

  • 注意:order-service的service层,是order去拉取user,userservice对应的是user-service的yml文件中spring.application.name服务名称

  • 2.在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解:@LoadBalanced

@MapperScan("cn.study.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();
    }

}
  • 两个user-service都有查询实现了负载均衡。

SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务
SpringCloud-Eureka注册中心,SpringCloud微服务分布式架构,spring cloud,eureka,微服务

  • 注意:如果在项目的类路径下存在Spring Cloud Ribbon相关的类,需要通过配置关闭Ribbon功能,因为Spring Cloud默认优先使用Ribbon:
spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false

总结:文章来源地址https://www.toymoban.com/news/detail-798220.html

  • 1.搭建EurekaServer
    • 引入eureka-server依赖
    • 添加@EnableEurekaServer注解·在application.yml中配置eureka地址
  • 2.服务注册
    • 引入eureka-client依赖
    • 在application.yml中配置eureka地址
  • 3.服务发现
    • 引入eureka-client依赖
    • 在application.yml中配置eureka地址
    • 给RestTemplate添加@LoadBalanced注解
    • 用服务提供者的服务名称远程调用

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

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

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

相关文章

  • SpringCloud搭建Eureka服务注册中心(六)

    前面说过eureka是c/s模式的  server服务端就是服务注册中心,其他的都是client客户端,服务端用来管理所有服务,客户端通过注册中心,来调用具体的服务; 我们先来搭建下服务端,也就是服务注册中心; project xmlns=\\\"http://maven.apache.org/POM/4.0.0\\\" xmlns:xsi=\\\"http://www.w3.org/2001/XMLSche

    2024年02月10日
    浏览(48)
  • 【微服务 SpringCloud】实用篇 · Eureka注册中心

    微服务(3) 假如我们的服务提供者 user-service部署了多个实例(不同实例,端口号不一致) ,如图: 大家思考几个问题: 我们刚才的编程,是写死在程序里的,ip和端口都是写死的, 这种硬编码的方式,之后改变ip和端口代码不就没法用了? order-service在发起远程调用的时候

    2024年02月08日
    浏览(28)
  • SpringCloud微服务技术栈的注册中心Eureka

    在微服务架构中,服务的数量庞大,而且每个服务可能会有多个实例。此时,需要一个中心化的地方来管理和维护各个服务的相关信息,这就是微服务治理中很重要的一环:服务注册与发现。其中,服务注册是指将提供服务的应用实例注册到注册中心,而服务发现则是指从注

    2023年04月09日
    浏览(42)
  • SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

    目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现  二:Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以

    2024年02月05日
    浏览(31)
  • # 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(3)

    段子手168 Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署, Eureka Server 实例会彼此增量地同步信息,从而确保所有节点数据一致。 事实上,节点之间相互注册是 Eureka Server 的默认行为。 1)修改 eureka_server 子工程(子模块)中的 application.yml 文件 模拟两个

    2024年04月26日
    浏览(30)
  • 微服务springcloud 02 创建项目中的三个service子系统,springcloud中注册中心Eureka介绍和把三个系统注册到Eureka中

    item service项目 01.使用springboot创建项目 02.选择依懒项 在这里插入代码片 spring web 03.添加sp01-commons依赖 在pom.xml文件中 04.修改application.yml ItemServiceImpl 05.创建接口实现类和controller类 ItemController 注:Spring MVC接受参数的几个注解,controller类中使用的参数注解 注解@GetMapping()=@

    2024年02月09日
    浏览(35)
  • 基于SpringCloud的微服务架构学习笔记(2)注册中心Eureka和负载均衡Ribbon

    1.7.1 远程调用的问题 地址信息获取 : 服务消费者 如何获取 服务提供者 的 地址信息 (不能每次都写死): URL:http://localhost:8081/user/\\\"+order.getUserId() 多选一 :如果有多个服务提供者,消费者如何进行选择 监测健康状态 :消费者如何获知提供者的健康状态 1.7.2 eureka原理 地址

    2024年02月13日
    浏览(27)
  • SpringCloud-Eureka【服务案例】,掌握数据库其实很容易

    3.修改启动类 在启动类的头部开启Eureka客户端的主键 4.添加配置信息 在application.properties中添加如下的信息 spring.application.name=eureka-provider server.port=9090 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/ 注意eureka1和eureka2我们需要在hosts文件中配置映射如下

    2024年04月16日
    浏览(24)
  • springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 Eureka包含两个组件:Eureka Server和Eure

    2024年04月10日
    浏览(32)
  • SpringCloud --- Eureka注册中心

    假如我们的服务提供者user-service部署了多个实例,如图 思考几个问题: order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口? 有多个user-service实例地址,order-service调用时该如何选择? order-service如何得知某个user-service实例是否依然健康,是不是已经宕

    2023年04月24日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包