it编程 > 编程语言 > Java

【微服务】SpringCloud-eureka光速入门

38人参与 2024-07-28 Java

springcloud-eureka光速入门

一、eureka 主要组件

二、工作流程

三、优势

四、eureka-光速入门【重点】

4.1 案例准备

4.1.1 创建父工程 tingyi-shop

4.1.2 创建子工程 tingyi-goods

4.1.3 创建子工程 tingyi-order

4.1.4 案例调整

4.1.4.1 在order模块创建 resttemplate对象

4.1.4.2 修改ordercontroller

4.1.4.2 重启并测试

4.2 为什么使用eureka

4.2 eureka光速入门

4.2.1 创建eurekaserver

4.2.2 调整商品模块

4.2.3 调整订单模块

4.2.4 调整订单模块, 调用商品模块

4.2.4 测试

4.3 eureka的安全性

4.4 eureka的高可用

4.4.1 配置以及代码

4.4.2 测试

4.4.3 eureka的细节


🎈边走、边悟🎈迟早会好

eureka 是 netflix 开源的一个服务注册和发现工具,主要用于构建分布式系统中的服务发现机制。它在 spring cloud 生态系统中广泛使用,尤其在微服务架构中扮演重要角色。

一、eureka 主要组件

  1. eureka server:

    • 作为服务注册中心,负责管理服务实例的注册和心跳检测。
    • 服务实例在启动时向 eureka server 注册,并定期发送心跳以保持注册信息的有效性。
    • eureka server 通常部署为集群,确保高可用性和容错性。
  2. eureka client:

    • 是注册在 eureka server 上的服务实例。
    • 它可以是任何类型的微服务应用程序,在启动时向 eureka server 注册并定期发送心跳。
    • eureka client 也可以从 eureka server 获取其他已注册服务的信息,以实现服务间的调用和负载均衡。

二、工作流程

  1. 服务注册:

    • 服务实例在启动时向 eureka server 注册其自身的元数据信息,如 ip 地址、端口号、服务名称等。
  2. 服务心跳:

    • 注册后,服务实例定期向 eureka server 发送心跳请求,以表明其仍然活跃。若在一段时间内未收到心跳,eureka server 将认为该实例已失效,并将其从注册列表中移除。
  3. 服务发现:

    • 服务调用者(客户端)通过 eureka server 查询可用的服务实例列表,以实现服务调用。
    • eureka client 缓存这些信息,并定期从 eureka server 更新,确保负载均衡和高可用性。
  4. 负载均衡:

    • 客户端根据从 eureka server 获取的服务实例列表,实现客户端负载均衡。
    • 常见的负载均衡策略包括轮询、随机选择、加权轮询等。

三、优势

eureka 在 netflix 的微服务架构中得到了广泛应用,并成为 spring cloud 的核心组件之一,用于实现服务注册与发现。

四、eureka-光速入门【重点

4.1 案例准备

4.1.1 创建父工程 tingyi-shop

pom.xml

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>
​
<packaging>pom</packaging>
​
<parent>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-parent</artifactid>
  <version>2.2.8.release</version>
</parent>
​
<dependencymanagement>
  <dependencies>
    <dependency>
      <groupid>org.springframework.cloud</groupid>
      <artifactid>spring-cloud-dependencies</artifactid>
      <!-- 版本号是按照伦敦地铁站的名字命名的 -->
      <version>hoxton.sr4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencymanagement>

4.1.2 创建子工程 tingyi-goods

pom.xml

<dependencies>
    <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
  </dependency>
</dependencies>

引导类

@springbootapplication
public class goodsapplication {
​
    public static void main(string[] args) {
        springapplication.run(goodsapplication.class, args);
    }
}

application.yml

server:
  port: 9001
#指定服务的名称
spring:
  application:
    name: tingyi-goods

controller编写

@restcontroller
public class goodscontroller {
​
    @requestmapping("/query")
    public string query() {
        return "查询商品信息!";
    }
}

启动并查看效果

4.1.3 创建子工程 tingyi-order

pom.xml

<dependencies>
    <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
  </dependency>
</dependencies>

引导类

@springbootapplication
public class orderapplication {
​
    public static void main(string[] args) {
        springapplication.run(orderapplication.class,args);
    }
​
}

application.yml

server:
  port: 9002
#指定服务的名称
spring:
  application:
    name: tingyi-order
 

编写controller

@restcontroller
public class ordercontroller {
    @requestmapping("/query")
    public string query(){
        return "查询订单";
    }
}

启动并查看效果

4.1.4 案例调整

​ 在查询订单时,同时也需要获取商品的信息,那么我们如何查询商品信息呢?

​ 我们可以通过spring为我们提供的resttemplate 模板对象 远程调用商品模块中的 控制器。

4.1.4.1 在order模块创建 resttemplate对象
@configuration
public class resttemplateconfig {
    @bean
    public resttemplate resttemplate(clienthttprequestfactory factory) {
        return new resttemplate(factory);
    }
​
    @bean
    public clienthttprequestfactory simpleclienthttprequestfactory() {
        simpleclienthttprequestfactory factory = new simpleclienthttprequestfactory();
        factory.setreadtimeout(5000);//ms
        factory.setconnecttimeout(15000);//ms
        return factory;
    }
}
4.1.4.2 修改ordercontroller

4.1.4.2 重启并测试

4.2 为什么使用eureka

eureka

4.2 eureka光速入门

4.2.1 创建eurekaserver
<dependencies>
    <dependency>
        <groupid>org.springframework.cloud</groupid>
        <artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
    </dependency>
​
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
</dependencies>
@springbootapplication
@enableeurekaserver
public class eurekaapplication {
​
    public static void main(string[] args) {
        springapplication.run(eurekaapplication.class,args);
    }
​
}
server:
  port: 8761      # 端口号
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost   # localhost
  client:
    # 表示是否将自己注册到eureka server,默认为true
    registerwitheureka: false
    # 表示是否从eureka server获取注册信息,默认为true。
    # 因为这是一个单点的eureka server,不需要同步其他的eureka server节点的数据,故而设为false
    fetchregistry: false
    # 设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
    serviceurl:
      defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动 eurekaserver并访问

4.2.2 调整商品模块
<dependency>
  <groupid>org.springframework.cloud</groupid>
  <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
  <version>2.2.2.release</version>
</dependency>
@springbootapplication
@enableeurekaclient
public class goodsapplication {
​
    public static void main(string[] args) {
        springapplication.run(goodsapplication.class,args);
    }
​
}
# 指定eureka服务地址
eureka:
  client:
    service-url:
      defaultzone: http://localhost:8761/eureka
    # eureka服务中, 显示的当前search业务微服务的访问地址.
  instance:
    home-page-url: http://localhost:${server.port}  
  

4.2.3 调整订单模块
<dependency>
  <groupid>org.springframework.cloud</groupid>
  <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
  <version>2.2.2.release</version>
</dependency>
@springbootapplication
@enableeurekaclient
public class orderapplication {
​
    public static void main(string[] args) {
        springapplication.run(orderapplication.class,args);
    }
​
}
# 指定eureka服务地址
eureka:
  client:
    service-url:
      defaultzone: http://localhost:8761/eureka

4.2.4 调整订单模块, 调用商品模块
@restcontroller
public class ordercontroller {
​
    @autowired
    eurekaclient eurekaclient;
​
    //自动注入resttemplate对象
    @autowired
    resttemplate template;
​
    @requestmapping("/query")
    public string query(){
        //根据eureka上注册的服务名称获取实例对象
        instanceinfo instanceinfo = eurekaclient.getnextserverfromeureka("tingyi-goods", false);
        //获取对应模块的url
        string url = instanceinfo.gethomepageurl();
        responseentity<string> responseentity = template.getforentity(url + "/query", string.class);
​
        //返回结果
        return "查询订单" + "&" + responseentity.getbody();
    }
}

4.2.4 测试

4.3 eureka的安全性

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-security</artifactid>
</dependency>
package com.tingyi.config;
​
import org.springframework.security.config.annotation.web.builders.httpsecurity;
import org.springframework.security.config.annotation.web.configuration.enablewebsecurity;
import org.springframework.security.config.annotation.web.configuration.websecurityconfigureradapter;
​
/**
 * @author tingyi
 */
@enablewebsecurity
public class websecurityconfig extends websecurityconfigureradapter {
​
    @override
    protected void configure(httpsecurity http) throws exception {
        // 忽略掉/eureka/**
        http.csrf().ignoringantmatchers("/eureka/**");
        super.configure(http);
    }
}
server:
  port: 8761      # 端口号
spring:
  application:
    name: eureka-server
  # 指定eureka的用户名和密码
  security:
    user:
      name: root
      password: root
eureka:
  instance:
    hostname: localhost   # localhost
  client:
    # 表示是否将自己注册到eureka server,默认为true
    registerwitheureka: false
    # 表示是否从eureka server获取注册信息,默认为true。
    # 因为这是一个单点的eureka server,不需要同步其他的eureka server节点的数据,故而设为false
    fetchregistry: false
    # 设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
    serviceurl:
      defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/
eureka:
  client:
    service-url:
      defaultzone: http://用户名:密码@localhost:8761/eureka

4.4 eureka的高可用

4.4.1 配置以及代码
server:
  port: 9001
#指定服务的名称
spring:
  application:
    name: tingyi-order
# 指定eureka服务地址
eureka:
  client:
    service-url:
      defaultzone: http://root:root@eureka-server1:8761/eureka,http://root:root@eureka-server2:8762/eureka
server:
  port: 9002
#指定服务的名称
spring:
  application:
    name: tingyi-goods
# 指定eureka服务地址
eureka:
  client:
    service-url:
      defaultzone: http://root:root@eureka-server1:8761/eureka,http://root:root@eureka-server2:8762/eureka

server:
  port: 8761      # 端口号
spring:
  application:
    name: eureka-server
  security:
    user:
      name: root
      password: root
eureka:
  instance:
    hostname: localhost   # localhost
  client:
    # 表示是否将自己注册到eureka server,默认为true
    registerwitheureka: true
    # 表示是否从eureka server获取注册信息,默认为true。
    fetchregistry: true
    # 设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
    serviceurl:
      defaultzone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka/
  # eureka自我保护机制关闭, 当开启自我保护机制开启后,实例不会删除,
  # 导致部分请求会连接不存在的实例,客户端没有做重试或者熔断的话会出大量问题
  server:
    enable-self-preservation: false

配置域名(只是用来欺骗自己的电脑)

4.4.2 测试

演示eureka集群

4.4.3 eureka的细节
eureka:
  instance:
    lease-renewal-interval-in-seconds: 30      #心跳的间隔
    lease-expiration-duration-in-seconds: 90    # 多久没发送,就认为你宕机了
eureka:
  client:
    registry-fetch-interval-seconds: 30 # 每隔多久去更新一下本地的注册表缓存信息
eureka:
  server:
    enable-self-preservation: true  # 开启自我保护机制, 建议开发阶段设置为false, 不然服务停了, eureka中的信息还在.

🎈众口难调🎈从心就好

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Eureka上集成Spring Cloud 微服务网关 gateway

07-28

Docker容器及镜像打包操作指南

07-28

【微服务开篇-RestTemplate服务调用、Eureka注册中心、Nacos注册中心】

07-28

Eureka使用详解,看这篇就够了,超详细,很香!!!

07-28

【SpringCloud篇】Eureka服务的基本配置和操作

07-28

云原生微服务治理 第四章 Spring Cloud Netflix 服务注册/发现组件Eureka

07-28

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论