搭建环境: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>
然后点击新建创建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>
注意目录结构本模块只管理实体类
同上我们再创建一个生产者类
为具体访问的模块
所需依赖如下:
<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>
按照普通的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
启动类需要加入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>
然后是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
这里有一个集群操作,其他注册中心按照这个写就行,只需要改一下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>
然后需要建一个config文件夹
下面编写:
大家注意哈,开启负载均衡一定要编写多个生产者,也就是8001,8002,8003
基本一致,我只说不一样的地方:
然后编写80的controller层
先创建一个controller
代码如下:正常的controller层代码
packagecom.hyx.springcloud.controller;importcom.hyx.springcloud.entity.Dept;importcom.hyx.springcloud.service.MyApiService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;/**
* @author hyx
* @date 2024/7/17
* @since JDK 1.8
*/@RestController@RequestMapping("/dept")publicclassDeptController{@AutowiredprivateMyApiService myApiService;@PostMapping("/findAll")publicList<Dept>findAllDept(){return myApiService.findAllDept();}@GetMapping("/findById/{id}")publicDeptfindByIdDept(@PathVariable("id")Integer id){return myApiService.findById(id);}@PostMapping("/add")publicintaddDept(@RequestBodyDept dept){return myApiService.addDept(dept);}}
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模块提供的
packagecom.hyx.springcloud.controller;importcom.hyx.springcloud.entity.Dept;importcom.hyx.springcloud.service.MyApiService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;/**
* @author hyx
* @date 2024/7/17
* @since JDK 1.8
*/@RestController@RequestMapping("/dept")publicclassDeptController{@AutowiredprivateMyApiService myApiService;@PostMapping("/findAll")publicList<Dept>findAllDept(){return myApiService.findAllDept();}@GetMapping("/findById/{id}")publicDeptfindByIdDept(@PathVariable("id")Integer id){return myApiService.findById(id);}@PostMapping("/add")publicintaddDept(@RequestBodyDept dept){return myApiService.addDept(dept);}}
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>
至于其他的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>
我们在需要熔断的服务添加下面内容,处理方法就是一个备选,当无错误的时候正常访问数据,当出现错误时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>
然后是application配置文件:
server:port:9001hystrix:dashboard:proxy-stream-allow-list:"localhost"
然后是Java启动类
@SpringBootApplication@EnableHystrixDashboardpublicclassDashboardHystrix_9001{publicstaticvoidmain(String[] args){SpringApplication.run(DashboardHystrix_9001.class, args);}}
8001修改:之前添加的不用重复添加
这两个服务全部启动起来访问:http://localhost:8001/actuator/hystrix.stream
至少也要启动下面的服务
如果一直ping的话然后查看8001也没有写错的话:只需要访问一下80的某个controller链接再访问就正常了
然后访问监控页面9001
看到下面这个页面就成功了
版权归原作者 拥你ω 所有, 如有侵权,请联系我们删除。