Spring Cloud Eureka 入门

完整源码:https://gitee.com/wan-lianglin/springcloud-test

  1. 什么是Eureka

Netflix在设计Eureka时,遵循的就是AP原则

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

SpringCloud封装了NetFlix公司开发的Eureka模块来实现服务注册和发现(对比Zookeeper)Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心

而系统中的其他微服务。使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,SpringCloud的一些其他模块(比如Zuul)就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑;

2.使用springboot配置Eureka注册中心

  1. 导入依赖:

(1)Spring Cloud Starter Eureka Server依赖

(2)热部署工具(可不用导入)

<!-- eureka-server -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

<!--热部署工具-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
2.Eureka配置
#端口号
server:
  port: 7001

#Eureka配置
eureka:
  instance:
    hostname: localhost #Eureka服务端的实例名称
  client:
    register-with-eureka: false #表示是否向eureka注册中心注册自己
    fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
    service-url: # 监控页面
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

ctrl+鼠标左键点击defaultZone进入源码可以看到:

我们可以从源码处看到defaultZone的默认url为http://localhost:8761/eureka/,而我配置的是本机7001端口,即url:http://localhost:7001/eureka/

3.配置Eureka服务端的启动类

启动成功后进入http://localhost:7001/可以访问Eureka注册中心默认画面

到这里,一个简单的注册中心配置完成。

  1. 将服务提供者注册进注册中心

先介绍一下我的项目结构

本项目有四个模块:

1.springcloud-eureka-7001:eureka注册中心,端口号为7001

2.springcloud-provider-dept-8001:服务提供者,端口号为8001

3.springcloud-consumer-dept-8002:消费者,端口号为8003(注意一下,这个端口号为8003

4.springcloud-api:一个api,用于提供dept实体类

当然,还有一个总的父类模块,配置了以下依赖,用于子类模块使用

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wll</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud-api</module>
        <module>springcloud-provider-dept-8001</module>
        <module>springcloud-consumer-dept-8002</module>
        <module>springcloud-eureka-7001</module>
    </modules>

    <!-- 打包方式 pom-->
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.22</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- spring-cloud 依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springboot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--德鲁伊数据池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.21</version>
            </dependency>
            <!--spirngboot启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.1</version>
            </dependency>

            <!--日志测试~-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

</project>
1.导包

在服务提供者模块中导入Spring Cloud Starter Eureka依赖

即最后一个依赖

<?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>springcloud</artifactId>
        <groupId>com.wll</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-provider-dept-8001</artifactId>

    <dependencies>
        <!--我们需要拿到实体类,所以要配置api module-->
        <dependency>
            <groupId>com.wll</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--jetty-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <!--热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>


        <!-- eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

    </dependencies>

</project>
2.编写配置文件
server:
  port: 8001

#mybatis配置
mybatis:
  type-aliases-package: com.wll.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

#spring配置
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root

#Eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/ #对应注册中心的端口,将此实例注册进注册中心
  1. 配置启动类

使用@EnableEurekaClient注解开启Eureka自动注册

先启动7001,接着启动8001

我们可以看到,已成功注册到eureka中,但是,当我们点击Status时,会发现不能成功跳转页面,我们还需要完善监控信息,添加在pom中添加一个依赖

<!-- actuator 完善监控信息 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

接着我们可以在application.yml中进行配置

#info配置
info:
  app.name: wll-springcloud
  company.name: wll.com

重启服务提供者

点击查看提供者的监控信息

我们可以看到跳转的页面上有我们配置的info信息

3.服务发现

在团队开发中,我们可以通过服务发现来查看实例信息

package com.wll.springcloud.controller;

import com.wll.springcloud.pojo.Dept;
import com.wll.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;

    //获取一些配置信息,得到具体的微服务
    @Autowired
    private DiscoveryClient client;

    @PostMapping("/dept/add")
    public boolean addDept(@RequestBody Dept dept){
        return deptService.addDept(dept);
    }

    @GetMapping("/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        return deptService.queryById(id);
    }

    @GetMapping("/dept/list")
    public List<Dept> queryAll(){
        return deptService.queryAll();
    }


    /**
     * 服务发现
     * @return
     */
    @GetMapping("/dept/discovery")
    public Object discovery(){
        //获取微服务列表清单
        List<String> services = client.getServices();
        System.out.println("discovery=>services:"+services);

        //通过微服务id得到一个具体的微服务信息
        List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
        for (ServiceInstance instance : instances) {
            System.out.println(
                    instance.getHost()+"\t"+
                    instance.getPort()+"\t"+
                    instance.getUri()+"\t"+
                    instance.getServiceId()
            );
        }
        return this.client;
    }
}

在controller层中,我们注入了DiscoveryClient接口,接着通过client.getServices()方法获取微服务列表清单,通过client.getInstances(“微服务id”);通过微服务id得到一个具体的微服务信息。

在启动类中

//启动类
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@EnableDiscoveryClient //使服务发现生效
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class);
    }
}

在启动类中使用@EnableDiscoveryClient注解,使服务发现生效

重启服务提供者(springcloud-provider-dept-8001),在网页通过localhost:8001/dept/discovery获得以下数据

idea输出:

4.集群环境配置

首先坐好准备工作:

我们创建3个eureka注册中心,分别为springcloud-eureka-7001,springcloud-eureka-7001=2,springcloud-eureka-7003。

改为:

将7001中的依赖复制到7002和7003中,同时在配置文件中修改7002的端口号为7002,7003的端口号为7003

最后,编写7002和7003的启动类,如上图

启动7002和7003可以看到搭建成功。

接下来,我们正式开始搭集群:

1.修改本机C:\Windows\System32\drivers\etc路径下的hosts文件,做一下映射

可以看到我做了三个域名映射

接着在7001端口的配置文件中配7002、7003端口,7002端口的配置文件中配7001、7003端口,7003端口的配置文件中配7001、7002端口,实现集群。

例如:

7001:

7002:

7003:

最后别忘了修改服务提供者的application.yml,实现集群发布:

server:
  port: 8001

#mybatis配置
mybatis:
  type-aliases-package: com.wll.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

#spring配置
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root

#Eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/


#info配置
info:
  app.name: wll-springcloud
  company.name: wll.comlk

开启3个eureka注册中心,开启服务提供者

我们可以看到所有的注册中心都成功注册了服务提供者,并且3个注册中心互相关联。

所有springcloud入门相关(建议从上到下依次阅读):

(14条消息) Spring Cloud Eureka 入门_万1999的博客-CSDN博客

(6条消息) Spring Cloud Ribbon 入门_万1999的博客-CSDN博客

(14条消息) Spring Cloud Hystrix 入门_万1999的博客-CSDN博客

(14条消息) Zuul路由网关_万1999的博客-CSDN博客

(14条消息) SpringCloud config分布式配置_万1999的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值