当前位置:   article > 正文

spring cloud环境搭建,Eureka集群,Ribbon负载均衡

eureka集群

搭建环境:jdk1.8,Hoxton.SR8,springboot2.2.2,mysql8
开发工具:idea,maven

我们首先了解什么是spring cloud:

  • SpringCloud体系结构图:
  • API GateWay:网关。所有的请求进来先进入网关,网关负责怎么处理。
  • dashboard:服务出现问题了该怎么处理。
  • microservices:微服务
  • Service registry:注册中心
  • SpringCloud,基于Springboot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。 Dubbo SpringCloud服务注册中心 Zookeeper SpringCloud NetFix Eurrka服务调用方式 RPC Rest API服务监控 Dubbo-monitor SpringBoot Admin断路器 不完善 SpringCloud NetFix Hystrix服务网关 无 SpringCloud NetFix Zuul分布式配置 无 SpringCloud Config数据线 无 SpringCloud Stream批量任务 无 SpringCloud Task
  • SpringCloud为开发人员提供了构建分布式系统的一些工具,包括配置管理,服务发现,断路器,路
    由,微代理,事件总线,全局锁,决策竞选,分布式会话。都以通过Springboot开发风格做到一键启动
    和部署。

创建最外层项目,父项目

首先创建一个普通的空项目
在空项目里面添加模块,一会所有的项目都在这里搭建:
在这里插入图片描述
我们首先添加pom依赖:
由于把src删除了所以刷新maven是无效的,可以先把依赖下载完再删除是src目录

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.21</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.10</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.26</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

然后点击新建创建module名为springcloud-api的实体管理
在这里插入图片描述
在新创建的模块添加依赖用来生成实体类方法

<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意目录结构本模块只管理实体类
在这里插入图片描述

同上我们再创建一个生产者类

为具体访问的模块

在这里插入图片描述
所需依赖如下:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.hyx.springcloud</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

按照普通的springboot项目创建分层结构,实体类不用创建我们只需要引入即可,上面的maven依赖已将将实体引入
在这里插入图片描述
这是application.yml配置文件的内容
注意数据库等信息修改

server:
  port: 8001
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/db01?serverTimezone=UTC
    username: root
    password: 123456
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7002:7002/eureka/,
  instance:
    instance-id: provider-dept:8001
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

启动类需要加入eureka注解 @EnableEurekaClient 这样注册中心才能发现这个类
在这里插入图片描述
下面开始编写注册中心

  • 这三个eureka注册中心内容基本一样但是要相互注册这样才能保证高可用
  • 注册中心主要是保证负载均衡的高可用,当一个服务挂掉以后会将这个服务从注册表中删掉
  • 其中有一个心跳机制,超过30秒无心跳将会认为服务挂掉了
  • eureka也有一个可视化页面,可以直观的看到注册服务

在这里插入图片描述
首先创建目录结构
在这里插入图片描述
添加maven依赖,就一个eureka依赖

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

    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后是7001的application.yml文件

server:
  port: 7001

eureka:
  client:
    fetch-registry: false #false自己为注册中心
    register-with-eureka: false #是否向注册中心注册自己
    service-url:
    #单机操作
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/   
#集群
      defaultZone: http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/
  instance:
    hostname: eureka7001
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里有一个集群操作,其他注册中心按照这个写就行,只需要改一下Url就行

启动类需要加一个**@EnableEurekaServer**注解
注册中心启动类
然后需要编写一个80模块进行通信,两种方式

  • restTemplate,利用模板进行通信
  • Feign:进行通信需要修改实体类@FeignClient
  • 以上两种方法我都写,用一种即可
    方法一
    无需添加实体类任何东西,只要添加新的模块即可
    在这里插入图片描述
    首先还是修改pom.xml文件
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.hyx.springcloud</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

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

    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

然后需要建一个config文件夹
下面编写:
在这里插入图片描述
大家注意哈,开启负载均衡一定要编写多个生产者,也就是8001,8002,8003
基本一致,我只说不一样的地方:

- List item
然后编写80的controller层
先创建一个controller
代码如下:正常的controller层代码

package com.hyx.springcloud.controller;

import com.hyx.springcloud.entity.Dept;
import com.hyx.springcloud.service.MyApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author hyx
 * @date 2024/7/17
 * @since JDK 1.8
 */
@RestController
@RequestMapping("/dept")
public class DeptController {

    @Autowired
    private MyApiService myApiService;

    @PostMapping("/findAll")
    public List<Dept> findAllDept(){
        return myApiService.findAllDept();
    }

    @GetMapping("/findById/{id}")
    public Dept findByIdDept(@PathVariable("id") Integer id){
        return myApiService.findById(id);
    }

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

80的启动类编写如下
在这里插入图片描述
在电脑上找到这个文件进行修改,在最下边添加如下东西:
127.0.0.1 eureka7001
127.0.0.1 eureka7002
127.0.0.1 eureka7003
大家一定要添加不要觉得没用,因为配置文件已经填写了
在这里插入图片描述

然后启动7001,7002,7003,80,8001,8002,8003,七个服务,可以少启动,启动一个7001,另外两个7002,7003不启动也可以看到效果
出现这个页面看到也就成功了
在这里插入图片描述
然后访问80里面的链接
每次访问都是不一样的数据库
在这里插入图片描述
方式二
和方式一区别不大,我们重新建一个模块,也可以在原来模块基础上修改

Riboon负载均衡就是@LoadBalanced开启的
在这里插入图片描述
我们需要修改的有config文件夹和controller文件夹还有APi模块实体类模块添加一个service层
Controller层需要修改成Service是api模块提供的

package com.hyx.springcloud.controller;

import com.hyx.springcloud.entity.Dept;
import com.hyx.springcloud.service.MyApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author hyx
 * @date 2024/7/17
 * @since JDK 1.8
 */
@RestController
@RequestMapping("/dept")
public class DeptController {

    @Autowired
    private MyApiService myApiService;

    @PostMapping("/findAll")
    public List<Dept> findAllDept(){
        return myApiService.findAllDept();
    }

    @GetMapping("/findById/{id}")
    public Dept findByIdDept(@PathVariable("id") Integer id){
        return myApiService.findById(id);
    }

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

APi添加下面依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述
至于其他的dept实体和上面都一样

到目前为止基本的spring cloud已经搭建完毕,有注册中心,被注册的服务层,和调用者客户端成,负载均衡都结束了
hystrix服务提供了服务熔断,服务降级,和监控

我们再建一个模块进行hystrix模块
我们把8001模块进行复制粘贴

添加以下依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我们在需要熔断的服务添加下面内容,处理方法就是一个备选,当无错误的时候正常访问数据,当出现错误时hystrix就会进行熔断,启动备用方法返回客户端
在这里插入图片描述

在这里插入图片描述

具体效果如下:
在这里插入图片描述
服务降级就是当服务宕机或者手动把不重要的服务资源停掉,交给重要的服务,需要修改API模块
在这里插入图片描述
添加一个工厂然后把工厂交给service层:
在这里插入图片描述
然后我们把8001停掉测试访问80的服务:
在这里插入图片描述
搭建成功,至于监控需要服务熔断开启才能监控

再补充两个点,监控和路由spring cloud的基本知识点都囊括了
路由其实就是起到一个调用和拦截的作用

新建一个模块注意层级

在这里插入图片描述
首先是pom文件

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.hyx.springcloud</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

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

    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

然后是application配置文件:

server:
  port: 9001


hystrix:
  dashboard:
    proxy-stream-allow-list: "localhost"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

然后是Java启动类

@SpringBootApplication
@EnableHystrixDashboard
public class DashboardHystrix_9001 {

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

8001修改:之前添加的不用重复添加
在这里插入图片描述
这两个服务全部启动起来访问:http://localhost:8001/actuator/hystrix.stream
至少也要启动下面的服务
在这里插入图片描述
如果一直ping的话然后查看8001也没有写错的话:只需要访问一下80的某个controller链接再访问就正常了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后访问监控页面9001
在这里插入图片描述
看到下面这个页面就成功了
在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号