Spring Cloud简介
Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。
微服务架构(Microservices Architecture)
微服务架构的核心思想是,一个应用是由多个小的、相互独立的、微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖。不同服务通过一些轻量级交互机制来通信,例如 RPC、HTTP 等,服务可独立扩展伸缩,每个服务定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现,由独立的团队来维护。简单的来说,一个系统的不同模块转变成不同的服务!而且服务可以使用不同的技术加以实现!
服务治理
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
Spring Cloud Eureka
Spring Cloud Eureka来实现服务治理。
Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。
Eureka Server
提供服务注册和发现
添加依赖
在项目 spring-cloud-eureka-service pom.xml中引入需要的依赖内容:
开启服务注册
通过 @EnableEurekaServer 注解启动一个服务注册中心提供给其他应用进行对话,这个注解需要在springboot工程的启动application类上加
packageio.ymq.example.eureka.server;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublicclassEurekaServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaServerApplication.class,args);}}
添加配置
在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.yml配置文件中增加如下信息:
registerWithEureka:falsefetchRegistry:false
完整配置
server: port: 8761eureka: instance: hostname: localhost client: registerWithEureka:false
fetchRegistry:false
serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
访问服务
启动工程后,访问:http://localhost:8761/
可以看到下面的页面,其中还没有发现任何服务。
注册到Eureka
服务注册到Eureka,需要提供服务自身的元信息(如:主机,端口等),Eureka通过一个服务从各个实例接受心跳信息。如果心跳接受失败或超过配置时间,实例会从注册中心移除。
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@RestController
public class Application {
@RequestMapping("/")
public String home {
return "Hello world";
}
public static void main(String args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
@EnableEurekaClient 声明一个注册实例,@EnableDiscoveryClient可以将实例在Eureka上生效。
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
defaultZone 将注册中心连接提供给客户端,可以理解为一个心跳url。
服务元信息:
${spring.application.name} 实例名称;
${server.port} 实例端口;
服务状态监控
监控的目的是当服务提供者不可用时,服务会从注册中心下掉。当服务可用时可进行注册提供服务;
服务提供者配置:
spring.application.name=compute-service
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:5000/eureka/
eureka.client.healthcheck.enabled=true //代表开放服务健康检查功能
eureka.instance.statusPageUrlPath=/info
eureka.instance.healthCheckUrlPath=/health
同时需要引用actuator模块,此模块在涉及到健康健康,状态信息都需要引用依赖。
注册中心配置:
server.port=5000
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.server.enableSelfPreservation=false //不开放自身缓存,开放的话,会将服务列表在本地缓存
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
高可用
Eureka服务端没有后台存储,但注册的服务实例都需要发送心跳,保持自身在注册中心可用(可在内存存储状态),客户端同样保持一份备份,不必每次请求都获取。
Service Provider
服务提供方
将自身服务注册到 Eureka 注册中心,从而使服务消费方能够找到
添加依赖
在项目 spring-cloud-eureka-provider pom.xml中引入需要的依赖内容:
开启服务注册
在应用主类中通过加上 @EnableEurekaClient,但只有Eureka 可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka注册中心服务器
packageio.ymq.example.eureka.provider;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@SpringBootApplication@EnableEurekaClient@RestControllerpublicclassEurekaProviderApplication{@RequestMapping("/")publicStringhome(){return"Hello world";}publicstaticvoidmain(String[]args){SpringApplication.run(EurekaProviderApplication.class,args);}}
添加配置
需要配置才能找到Eureka服务器。例:
完整配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-provider
server:
port: 8081
其中defaultZone是一个魔术字符串后备值,为任何不表示首选项的客户端提供服务URL(即它是有用的默认值)。 通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问
访问服务
启动该工程后,再次访问启动工程后:http://localhost:8761/
如何一起学习,有没有免费资料?
在程序员这条路上遇到瓶颈的朋友可以加入群:171985536大家一起来提升进步 但要备注好信息 ,分享知识
关注下面公众号,获取BATJ等一线互联网企业面试题目和答案还有java技术干货知识等你领取 Java这点事