9.2(SpringCloud)Eureka初识注册中心

IDEA进行服务复制

Idea的Service/rundashboard

我们再使用负载均衡的时候需要多个服务

Idea中可以通过service来复制一个微服务

idea版本

我使用的版本是2020.1.1,service窗口中可以以配置方式启动微服务,一般是配置不同端口号启动。如下图。
(但是在旧版本中,对应的窗口叫做Run Dashboard窗口,旧版本的解决办法网上文章很多,请自行查找。)

img

我的Idea版本比较低,所以Run Dashboard

在这里插入图片描述

复制微服务,修改端口,因为端口重复会冲突

在这里插入图片描述

设置一些配置即可

端口号,项目名等

在这里插入图片描述

配置端口号

-Dserver.prot=8891

开启rundashboard

有的时候发现IDEA中没有RundashBoard,所以需要进行配置一下

在这里插入图片描述

这里可以通过IDEA的ctrl+f进行查找

在这里插入图片描述

        <option name="configurationTypes">
	      <set>
	        <option value="SpringBootApplicationConfigurationType" />
	      </set>
	    </option>

引入这段内容之后,重启服务即可

在这里插入图片描述

工程重构

因为我们在多个子模块中难免出现相同的类

  1. 比如说操作数据库的时候,多个模块之间的实体类,mapper类等都会出现重复的
  2. 我们就可以通过Maven提取出一个公共的模块。
  3. 其他模块进行引用该模块。实现代码的降低重复度

创建公共模块

在这里插入图片描述

pom中指定该模块位置

<?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>SpringCloudStu</artifactId>
        <groupId>SpringCloudStu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>


    <!--这里是为这个模块指定位置-->
    <!--可以将这个位置发送给其他模块-->
    <artifactId>moduleMore</artifactId>
    <groupId>moduleMore</groupId>
    <version>1.0-SNAPSHOT</version>

</project>

编写其他类

这些类作为公共访问的 实体类等

public class UserModule {
    public String name;
    public int age;
}

其他模块引用

在这里插入图片描述

在需要该模块类的模块pom中引入

这里编写的依赖是自己编写的模块位置
进行指定就可以访问该模块的类了

        <dependency>
            <artifactId>moduleMore</artifactId>
            <groupId>moduleMore</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


package cn.controller;

import cn.pojo.UserModule;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class OneController {

    @RequestMapping("/oneShow")
    @ResponseBody
    public String oneShow(){

//        自己模块本身不存在该类,这个类是从其他  模块 位置获取的
        new UserModule();

        return "show";
    }
}

Eureka(注册中心)

学习微服务一定要了解的东西。现在Eureka是我们在刚接触的时候最适合学习的。

Eureka基础概念

什么是服务治理

​ Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理

  在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册

服务注册和发现

Eureka是一个cs 设计架构,存在服务端和客户端。

Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

在这里插入图片描述

  1. 服务端开启
  2. 客户端向服务端注册,并定时接收心跳。判断服务是否还健康

服务端和消费端

Eureka包含两个组件:Eureka Server和Eureka Client

Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。

EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

添加服务端

建module,导入依赖,编写yaml,主程序,其他组件

这里的服务端,是为了其他服务的客户端注入

最终的Eureka服务端结构

在这里插入图片描述

引入依赖

<!--该注解才是Eureka服务端的主要依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <!--针对于SpringBoot的MVC操作-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--针对与SpringBoot的监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <!--用于热部署的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

yaml配置

server:
  port: 7001

# Eureka配置
eureka:
  instance:
    # Eureka服务端的实例名字
    hostname: 127.0.0.1
  client:
    # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
    register-with-eureka: false
    # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
    fetch-registry: false
    # Eureka监控页面~
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

主启动

@SpringBootApplication
//在主启动中开始eureka服务端
@EnableEurekaServer
public class EurekaMain {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain.class,args);

    }
}

结果页面

在这里插入图片描述

客户端入注册服务端

添加pom依赖

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

yaml添加

server:
  port: 8881

# Eureka配置:配置服务注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
  instance:
    #    改变了展示的路径
    instance-id: moduleOne

#为微服务取名字
spring:
  application:
    name: moduleOneprovider   # 表示服务的提供者

spring-application-name

这个名字很重要。我们通过RestTemplate的时候通过指定的路径进行访问。下面我们就可以通过该微服务名称进行访问。

多个微服务可以使用同一个名称,在调用名称的时候可以进行负载均衡

在这里插入图片描述

主启动

//主启动
@SpringBootApplication
@EnableEurekaClient
public class ModuleOne {
    public static void main(String[] args) {
        SpringApplication.run(ModuleOne.class,args);
    }
}

注册中心查看存在一个服务

在这里插入图片描述

Eureka工作流程

在这里插入图片描述

修改127.0.0.1

再我们访问本地页面的时候,一般都是localhost或者是127.0.0.1

下面的配置,可以让我们自定义

开始

C:\Windows\System32\drivers\etc

进入这个目录

在这里插入图片描述

修改hosts文件

这个东西不要乱动,会出现很多错误的(要小心)

在这里插入图片描述

下面可以使用设定好的代替127.0.0.1

在这里插入图片描述

看到确实可以使用wsl来代替

当修改文件的时候权限不够

我第一次再修改的时候权限不够,改完之后不给保存

可以先将hosts文件转换为txt格式

在这里插入图片描述

使用记事本管理员方式

在这里插入图片描述

修改完之后再txt文本换回去

在这里插入图片描述

Eureka的服务端集群

我们如果注册中心只有一个的话,当这一个注册中心宕机了

那么其他服务之间也就获取不了对方了。所以我们需要搭建集群避免出现错误

高可用:说的就是集群操作

互相注册,相互守望

操作

想要搭建Eureka集群就需要在创建一个Eureka的服务端

或者多个服务端。

多个Eureka的服务端基本上操作都是一样的。只需要修改多个和Eureka的配置文件。进行指定其他的Eureka即可

yaml配置
service-url:
  defaultZone: 多个Eureka服务地址,多个之间使用逗哈隔开

测试

server:
  port: 7001

# Eureka配置
eureka:
  instance:
    # Eureka服务端的实例名字
    hostname: eureka7001
  client:
    # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
    register-with-eureka: false
    # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
    fetch-registry: false
    # Eureka监控页面~
    service-url:
      defaultZone: http://wsl:7002/eureka/
server:
  port: 7002

# Eureka配置
eureka:
  instance:
    # Eureka服务端的实例名字
    hostname: eureka7002
  client:
    # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
    register-with-eureka: false
    # fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
    fetch-registry: false
    # Eureka监控页面~
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka/

在这里插入图片描述

  1. 发现我们明明没有在其他微服务客户端中指定注册到那个Eureka服务端。但是两方都存在Eureka客户端。
  2. 并且对方的集群中显示对方。

表示集群搭建成功

鼠标放在上面可以展示指定的集群位置

在这里插入图片描述

客户端可以进行修改

Eureka客户端通过yaml指定多个Eureka服务端

有的版本可能不需要去指定,客户端连接一个Eureka服务端。

因为集群就满足了其他服务端也可访问

service-url:
  defaultZone: 多个Eureka服务地址,多个之间使用逗哈隔开

Eureka客户端的集群

在这里插入图片描述

前面我们配置了服务端的集群。下面就需要创建多个客户端集群

再次创建一个Eureka客户端

#为微服务取名字
spring:
  application:
    name:    # 表示服务的提供者  
   

只要指定多个Eureka客户端的服务名称相同,就表示Eureka客户端符合集群

IDEA中我们可以通过RunDashboard克隆微服务

在这里插入图片描述

克隆一个微服务集群后

在这里插入图片描述

  1. 这两个因为端口号等我们需要一个一个配置。我不同同时启动
  2. 只要我们一个一个启动。在启动之前更改主体的代码。
  3. 谁启动,谁就运行主体的代码

这个期间避免热部署,自动更新,先将热部署的部分去掉

通过IDEA完成Eureka客户端的服务克隆了

在这里插入图片描述

使用Module2调用Module1的集群

以往我们在调用的时候通过写死请求的地址。当然我们之后肯定不能写死。

下面讲Module2注册到注册中心。进行负载均衡操作

可以看到现在

  1. Module1是集群存在两个
  2. Module2是消费者调用两个Module1

在这里插入图片描述

这一步省略

对RestTemplate进行修改

Module2的主启动类


//主启动
@SpringBootApplication
@EnableEurekaClient
public class ModuleTwo {
    public static void main(String[] args) {

        SpringApplication.run(ModuleTwo.class,args);
    }


//    因为主启动类也是一个  SpringBoot的配置类
//    我们通过配置类   像容器中添加一个 RestTemplate组件
//    可以进行远程访问 restful请求
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

Module2的调用Eureka的客户端集群

@Controller
public class TwoController {

//    获取RestTemplate组件
    @Autowired
    private RestTemplate restTemplate;

//    添加请求
    @RequestMapping("twoshow")
    @ResponseBody
    public String twoShow() {

//        在module2 中  通过RestTemplate 调用指定的请求
//        这里发现没有指定准确的ip地址。而是以服务名称代替
        String forObject = restTemplate.getForObject("http://moduleOneprovider/one", String.class);

        return "调用module1返回的结果:" + forObject;
    }
}

同一个请求,因为底层访问的Eureka客户端不同,产生不同的结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值