作为分布式架构开发的一种选择,Spring Cloud利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud是各类框架的集合,这一点和Spring Boot是一样的,因为Spring Cloud就是基于Spring Boot搭建的,Spring Boot可以单独构建项目,而Spring Boot却不能脱离Spring Boot。
Spring Cloud和Dubbo比起来,可以类比为Spring Security和Shiro,一个是各个方面都很到位,包含多种服务集成,另一个则是单点突出。目前市面上,微服务的框架很多,Spring Cloud适合中小型互联网公司,因为大公司有自己的微服务治理方案,小公司和传统企业则不需要Spring Cloud来进行服务治理,因为学习成本高、架构用不上,更适合用Dubbo、Kubernetes这些框架。因为近几年微服务架构和Docker容器概念火热,所以我觉得学习Spring Cloud长远上看可能会更有发展前景。
Eureka则是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。
SpringCloud系列作为我个人的学习记录,难免有错误和遗漏,欢迎指出ヾ(๑╹◡╹)ノ"
和创建普通的SpringBoot项目一样,不过在引入模块的时候注意添加SpringCloud所需要的模块
勾选后生成的项目依赖包含
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
在启动类上添加@EnableEurekaServer注解,表示这是Eureka的服务端
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
然后是配置yml文件
spring:
application:
name: eureka-server
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone:
http://localhost:${server.port}/eureka
eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true
eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true
eureka.client。service-url.defaultZone : 表示服务实例地址,默认http://localhost:8761/eureka
这里有个大坑,就是default Zone这个属性提示不出来,我一度以为是jar包导错了还是语法写的有问题,甚至以为SpringBoot2.0后的版本和1.0的版本配置有差别,最后查了资料发现,发现是Eureka不认识这个属性。。。其他的属性是提前做了处理,按照驼峰或横线来识别。service-url的属性是Map,只要按照k-v格式配置就行,如果直接忽略defaultZone这个前置,就会报Failed to bind properties under 'eureka.client.service-url' to java.util.Map这个错误。
运行启动文件,访问http://localhost:8761/可以看到如下界面,No instances available表示没有服务
同样创建一个SpringBoot项目,勾选的是Eureka Discovery模块,生成后依赖如下
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
在启动文件上添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
然后是配置文件
spring:
application:
name: eureka-client
server:
port: 8762
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
defaultZone指向server端的地址
启动服务可以看见服务成功注册了
实际生产环境中,为了保证系统的安全性和稳定性,服务注册中心需要两台及以上,保证服务的正常运行。使用集群就是保证高可用的一种解决方案,集群搭建的原理就是通过相互注册,也就是配置其他可用的service-url来进行高可用部署。
假设有三台服务器,那么拷贝三份server端,修改yml文件如下,即一个url指向其余两个url来保证服务注册中心的使用不会因为一台机器宕机而出现问题。
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2/eureka/,http://peer3/eureka/
---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1/eureka/,http://peer3/eureka/
---
spring:
profiles: peer3
eureka:
instance:
hostname: peer3
client:
serviceUrl:
defaultZone: http://peer1/eureka/,http://peer2/eureka/
demo地址:https://github.com/hong52ni/SpringCloud-Demo-Aggregate