微服务-Eureka

文章目录

提供者与消费者

Eureka注册中心

服务消费者该如何获取服务提供者的地址信息?

  • 服务提供者启动时向eureka注册自己的信息
    eureka保存这些信息
    消费者根据服务名称向eureka拉取提供者信息

如果有多个服务提供者,消费者该如何选择?(多个User-Service)

  • 服务消费者利用负载均衡算法,从服务列表中挑选一个

消费者如何得知服务提供者的健康状态?

  • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
    eureka会更新记录服务列表信息,心跳不正常会被剔除
    消费者就可以拉取到最新的信息

搭建EurekaServer

  1. 引入依赖,除了主要的@EnableEurekaServer外,@SpringBootApplication等注解也存在这个依赖里。
xml 复制代码
<dependencies>
     <!--Eureka服务端依赖-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
     </dependency>
</dependencies>
  1. 修改启动类,添加注解
java 复制代码
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}
  1. 修改配置文件,注册到Eureka;以及服务名称
yml 复制代码
server:
  port: 10086
spring:
  application: 
    name: eurekaserver # 服务名称
eureka:
  client:
    service-url: #将自己也注册到Eureka服务上,为了将来Eureka集群之间通信;例如有多个Eureka服务时,这些Eureka会互相做注册,为了数据交流,这里配的是Eureka集群的地址
      defaultZone: http://127.0.0.1:10086/eureka/ 
  1. 启动,在浏览器中测试

服务注册

将user-service和order-service服务都按照以下方式注册到Eureka上

  1. 添加Eureka客户端依赖
xml 复制代码
<!--Eureka客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 修改application.yml
    2.1 添加Eureka配置信息,将服务注册到Eureka
yml 复制代码
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka/ # 新增注册到eureka

2.2 增加服务名

yml 复制代码
spring:
  application:
    name: userservice # 新增服务名
  1. 启动,可以看到服务都被注册上了
  2. 在idea如何启动多个,例如这里再启动一个userservice服务

    修改Name,点击Modify options,选择add VM options

    输入-Dserver.port=8082,该服务将会启动在8082端口

    启动userservice2


    可以看到userservice有2个服务被注册

服务发现

  1. 将"主机+端口"改为服务名,通过服务名可直接调用该服务,不再需要ip和端口
java 复制代码
public Order queryOrderById(Long orderId) {
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    // 2.定义url
    // String url = "http://localhost:8081/user/"+order.getUserId();
    String url = "http://userservice/user/"+order.getUserId(); //修改为服务名
    // 3.发送http请求
    User user = restTemplate.getForObject(url, User.class);
    // 4.封装user
    order.setUser(user);
    // 5.返回
    return order;
}
  1. 给RestTemplate添加@LoadBalanced注解,表示负载均衡

必须添加该注解,否则会产生异常java.net.UnknownHostException: userservice;当只有一个userservice服务时,也会产生该异常

java 复制代码
@SpringBootConfiguration
public class WebConfiguration {

    @LoadBalanced //负载均衡
    @Bean //相当于@Controller,@Service等
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  1. 启动所有服务,在浏览器中输入4次http://localhost:8080/order/104,调用4次userservice服务时,发现UserApplication:8081和UserApplication2:8082分别被调用了2次,实现了负载均衡

项目结构


相关推荐
手握风云-几秒前
JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)
java·开发语言·java-ee
盖世英雄酱581367 分钟前
加了锁,加了事务 还是重复报名❓
java·数据库·后端
Pigwantofly10 分钟前
SpringAI入门及浅实践,实战 Spring‎ AI 调用大模型、提示词工程、对话记忆、Adv‎isor 的使用
java·大数据·人工智能·spring
GEM的左耳返24 分钟前
Java面试全方位解析:从基础到AI的技术交锋
spring boot·微服务·java面试·互联网大厂·rag技术·ai面试·java技术栈
ζั͡山 ั͡有扶苏 ั͡✾44 分钟前
RocketMQ 5.3.0 ARM64 架构安装部署指南
架构·rocketmq·国产系统·arm64
微笑听雨1 小时前
Java 设计模式之单例模式(详细解析)
java·后端
微笑听雨1 小时前
【Drools】(二)基于业务需求动态生成 DRL 规则文件:事实与动作定义详解
java·后端
Serendipity2611 小时前
微服务架构
前端·微服务
猫猫的小茶馆1 小时前
【STM32】FreeRTOS 任务的删除(三)
java·linux·stm32·单片机·嵌入式硬件·mcu·51单片机
天天摸鱼的java工程师1 小时前
🔧 MySQL 索引的设计原则有哪些?【原理 + 业务场景实战】
java·后端·面试