【Spring Cloud】 总结
一.Spring Cloud简介
简单来说,Spring Cloud 就是致力于分布式系统、微服务等的一套在目前非常火热的框架。但它的本身也是一系列框架的有序集合(由多个模块组成)。
相比较于Dubbo还是有很多不同之处的:例如Dubbo是基于RPC的服务框架,而Spring Cloud是基于RESTful API的服务框架。Dubbo是基于二进制的传输,而Spring Cloud是http协议传输等等。
二.Spring Cloud的Eureka组件
1.Eureka的作用
Eureka和zookeeper类似,能起到一个服务注册中心的作用
2.使用Eureka
在Spring Boot主类中添加@EnableEurekaServer注解即可开启Eureka(注意,需要引入相关的依赖,依赖如下)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.Eureka配置
在application.properties中配置如下
spring.application.name=spring-cloud-eureka
server.port=8060
eureka.instance.hostname=localhost
#配置服务中心 应将下列属性设为false
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
#访问路径
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/
4.测试服务中心
启动Spring Boot项目,访问端口后可以看到如下界面
5.服务提供者
在项目下新建一个Spring Boot项目的Module,并在主类中添加@EnableEurekaClient注解
在配置文件中添加如下配置
spring.application.name=spring-cloud-provider
server.port=8061
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/
启动项目后发现服务中心多了一个服务提供者,如下图所示
6.服务消费者
Spring Cloud创建服务消费者有两种方式,分别是使用Ribbon和使用Feign
1.Ribbon的方式创建服务消费者
(1)首先引入相关的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
(2)在主类中添加@EnableDiscoveryClient注解
(3)最后在配置文件中配置如下
spring.application.name=spring-cloud-consumer
server.port=8063
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/
(4)服务消费者调用服务提供者中的方法
创建RestTemplate对象,并调用该对象的getForObject方法,例如下列代码
service层
@Service
public class MyService {
@Autowired
private RestTemplate restTemplate; public String getPort(){
//调用服务提供方的方法
return restTemplate.getForObject("http://spring-cloud-provider:getPort",String.class);
}
}
controller层
@RestController
public class MyController {
@Autowired
private MyService myService;
@RequestMapping("/getPort")
public String getPort(){
return myService.getPort();
}
}
测试结果如下
如果需要配置负载均衡策略,可以在服务消费者中添加一个配置类,再开启一个其他端口的服务提供者即可
@Configuration
public class MyConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.Feign的方式创建服务消费者
(1)首先引入相关的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)然后在主类中添加 @EnableFeignClients 和 @EnableDiscoveryClient 注解,配置文件与Ribbon的方式类似
(3)服务消费者调用服务提供者中的方法
在service层中的代码如下
@FeignClient(value = "spring-cloud-provider")
public interface MyService {
@RequestMapping(value = "getPort" , method = RequestMethod.GET)
public String getPort(); }
在controller层中的代码如下
@RestController
public class MyController {
@Autowired
private MyService myService; @RequestMapping(value = "getPort" , method = RequestMethod.GET)
public String getPort(){
return myService.getPort();
}
}
由于Feign的方式本身包含有了Ribbon,也实现了负载均衡,面向接口编程,写起来思路更清晰方便,实际开发中应用更广
三.Spring Cloud 熔断器
1.Ribbon的方式下添加熔断器
(1)导入相关的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)在主类中添加 @EnableHystrix 注解开启熔断器
(3)修改service层中的方法,在方法上添加 @HystrixCommand 注解,例如
@HystrixCommand(fallbackMethod = "getError")//如果getPort方法执行失败,会直接熔断该方法并执行getError方法(避免浏览器一直去加载)
public String getPort(){
//调用服务提供方的方法
return restTemplate.getForObject("http://spring-cloud-provider:getPort",String.class);
}
public String getError(){
return String.format("获取失败");
}
2.Feign的方式下添加熔断器
(1)Feign自带熔断器,但默认是关闭的,可以在application.properties中开启
feign.hystrix.enabled=true
(2)在service层的接口中添加熔断回调方法(在上面的代码的基础上,在@FeignClient 中添加熔断回调如下,如果出现熔断,则执行接口的实现类中的方法)
@FeignClient(value = "spring-cloud-provider",fallback = MyServiceImpl.class)//如果下面的方法执行失败,会熔断并去执行MyServiceImpl中的方法
(3)创建接口实现类,例如
@Component
public class MyServiceImpl implements MyService { @Override
public String getPort() {
return String.format("获取失败");
}
}
3熔断监控
如果需要监控熔断信息,可以做如下步骤
(1)导入相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
(2)在主类中添加注解 @EnableHystrixDashboard 开启熔断监控,启动项目,并访问/hystrix,页面如下
(3)添加配置类
@Configuration
public class MyConfig {
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/myhystrix");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
(4)在页面中输入路径即(ip+端口号+配置类中的addUrlMappings)可查看熔断信息,例如下图
四.Spring Cloud 网关服务
1.开启Zuul网关服务步骤如下
(1)引入相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
(2)在主类中添加 @EnableEurekaClient 和 @EnableZuulProxy 注解开启相应的服务
(3)在配置文件中配置如下
spring.application.name=spring-cloud-zuul
server.port=8065
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/
#指定网关路径,并设置其映射路径
zuul.routes.api-a.path=/api/ribbon/**
zuul.routes.api-a.serviceId=spring-cloud-consumer-ribbon
zuul.routes.api-b.path=/api/feign/**
zuul.routes.api-b.serviceId=spring-cloud-consumer-feign
(4)启动项目,可以通过网关来访问项目,例如下图
2.网关路由失败回调
编写一个回调实体类,并实现 FallbackProvider 接口即可,详细可以参考官方api文档
3.zuul过滤功能
编写一个过滤器,并实现ZuulFilter接口即可
五.Spring Cloud 配置中心
1.服务端配置
(1)导入相关依赖并在主类中开启@EnableEurekaClient 和 @EnableConfigServer注解
(2)在配置文件中配置如下(以github作为配置文件存放中心)
spring.application.name=spring-cloud-config
spring.cloud.config.label=master
#gitHub仓库地址
spring.cloud.config.server.git.uri=git@github.com:RetimeFor/spring-cloud-config-test.git
#存放配置文件的文件夹(相对以上仓库地址)
spring.cloud.config.server.git.search-paths=spring-cloud-config/others
spring.cloud.config.server.username=gitHub账号
spring.cloud.config.server.password=gitHub密码
#端口号配置为8888(不要在这里修改)
server.port=8888
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/
(3)测试结果如下(端口后直接跟 /文件的名字/master)
2.客户端配置
以Feign的服务端为例,只需要将配置文件中的内容用如下代码替换即可
spring.cloud.config.uri=http://localhost:8888
spring.cloud.config.name=other
spring.cloud.config.label=master
最新文章
- 异步http框架简介&;实现原理
- Cocos2d 学习资料推荐
- ios之无限 自动 图片轮播器的实现
- ESXi cron jobs
- 【题解】【数组】【查找】【Leetcode】Search in Rotated Sorted Array
- 解释清楚c++的重载操作符【用自己的话,解释清楚】
- sharepoint 备份和还原site脚本
- dhcp源码编译支持4G上网卡
- 根据rowid回表
- animation-timing-function中的cubic-bezier(n,n,n,n)
- POJ 3294 Life Forms(后缀数组+二分答案)
- hdu1159 LCS模板题
- java 三大框架
- js “top、clientTop、scrollTop、offsetTop…”
- Hadoop API:遍历文件分区目录,并根据目录下的数据进行并行提交spark任务
- [LeetCode] Split Array into Consecutive Subsequences 将数组分割成连续子序列
- [LeetCode] Magic Squares In Grid 网格中的神奇正方形
- Java并发编程1--synchronized关键字用法详解
- 4G模块luci的配置及重连脚本
- 如何让一个Java新手快速入门?
热门文章
- <;application>;节点属性
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-03 高级篇幅之zuul常用问题分析
- Mac下启动iOS模拟器
- 刀塔OMG塔防1.23单机版使用方法
- 动态加载js不执行解决办法
- 不要轻易使用ffmpeg的audio_device_number来设置音频设备
- zping ping包工具20180524.exe测试版
- *【Python】【demo实验31】【练习实例】【使用turtle画小猪佩奇】
- VMware虚拟机下安装CentOS 6.10并配置访问外网
- 小菜鸟之HTML第二课