初识Spring Cloud
微服务架构
Spring Cloud的主要组件
- 注册中心【★★★★★】
- 网关 【★★★★★】
- 配置中心【★★☆☆☆】
- 熔断器【★★☆☆☆】
- 负载均衡【★★☆☆☆】
- 消息总线【★☆☆☆☆】
- 数据监控【★☆☆☆☆】
Spring Cloud 与 Dubbo 对比
• Spring Cloud 与 Dubbo 都是实现微服务有效的工具。
• Dubbo 只是实现了服务治理,而Spring Cloud 子项目分别覆盖 了微服务架构下的众多部件。
• Dubbo 使用 RPC 通讯协议,Spring Cloud 使用 RESTful 完成 通信,Dubbo 效率略高于 Spring Cloud。
小节
• 微服务就是将项目的各个模块拆分为可独立运行、部署、测试的架构设计风格。
• Spring 公司将其他公司中微服务架构常用的组件整合起来,并使用 SpringBoot 简化其开发、配置。称为Spring Cloud
• Spring Cloud 与 Dubbo都是实现微服务有效的工具。Dubbo 性能更好,而Spring Cloud 功能更全面。
Spring Cloud 服务治理
Eureka
• Eureka 是 Netflix 公司开源的一个服务注册与发现的组件。
• Eureka 和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等)一起,被 Spring Cloud 社区整合为 Spring-Cloud-Netflix 模块。
• Eureka 包含两个组件:Eureka Server (注册中心) 和 Eureka Client (服务提供者、服务消费者)。
使用步骤
-
搭建 Provider 和 Consumer 服务。
-
使用 RestTemplate 完成远程调用。
• Spring提供的一种简单便捷的模板类,用于在java 代码里访问 restful 服务。
• 其功能与 HttpClient 类似,但是 RestTemplate 实现更优雅,使用更方便。 -
搭建 Eureka Server 服务。
① 创建 eureka-server 模块
② 引入 SpringCloud 和 euraka-server 相关依赖
③ 完成 Eureka Server 相关配置
④ 启动该模块 -
改造 Provider 和 Consumer 称为 Eureka Client。
① 引入 eureka-client 相关依赖
② 完成 eureka client 相关配置
③ 启动 测试 -
Consumer 服务 通过从 Eureka Server 中抓取 Provider 地址 完成 远程调用
- Eureka Server依赖:
<!-- eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- Eureka Server 配置:
eureka:
instance:
hostname: localhost # 主机名
client:
register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
- Eureka Server 启动类注解
@EnableEurekaServer
- Eureka client 依赖:
<!-- eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- Eureka client 配置
eureka:
instance:
hostname: localhost # 主机名
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
register-with-eureka: true # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: true # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
- Eureka client 启动类注解
@EnableEurekaClient
Eureka客户端如何获取服务列表
@Autowired
DiscoveryClient discoveryClient;
List<ServiceInstance> ins = discoveryClient.getInstances("服务名称");
String host = instance.getHost();//获取ip
int port = instance.getPort();//获取端口
Eureka 相关配置及特性
eureka 一共有4部分配置
- server : eureka 的服务端配置
- client : eureka 的客户端配置
- instance : eureka 的实例配置
- dashboard : eureka 的web控制台配置
Eureka – 相关配置及特性 - instance
Eureka – 相关配置及特性 - server
Eureka – 相关配置及特性 - client
Eureka – 相关配置及特性 - dashboard
Eureka – 高可用
- 准备两个Eureka Server
- 分别进行配置,相互注册
- Eureka Client 分别注册到这两个Eureka Server中
server1:
server:
port: 8761
eureka:
instance:
hostname: eureka-server1 # 主机名 单机环境需要修改hosts文件 对应127.0.0.1
client:
service-url:
defaultZone: http://eureka-server2:8762/eureka
register-with-eureka: true # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: true # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
spring:
application:
name: eureka-server-ha
server2:
server:
port: 8762
eureka:
instance:
hostname: eureka-server2 # 主机名 单机环境需要修改hosts文件 对应127.0.0.1
client:
service-url:
defaultZone: http://eureka-server1:8761/eureka
register-with-eureka: true # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: true # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
spring:
application:
name: eureka-server-ha
client:
server:
port: 8001
eureka:
instance:
hostname: localhost # 主机名
prefer-ip-address: true # 将当前实例的ip注册到eureka server 中。默认是false 注册主机名
ip-address: 127.0.0.1 # 设置当前实例的ip
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
client:
service-url:
defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
访问:http://localhost:8761/
访问:http://localhost:8762/
Consul
• Consul 是由 HashiCorp 基于 Go 语言开发的,支持多数据中心,分布式高可用的服务发布和注册服务软件。
• 用于实现分布式系统的服务发现与配置。
• 使用起来也较 为简单。具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件, 方便部署 。
• 官网地址:https://www.consul.io
spring:
cloud:
consul:
host: localhost # consul 服务端的 ip
port: 8500 # consul 服务端的端口 默认8500
discovery:
service-name: ${spring.application.name} # 当前应用注册到consul的名称
prefer-ip-address: true # 注册ip
application:
name: consul-provider # 应用名称
Nacos
• Nacos(Dynamic Naming and Configuration Service) 是阿里巴巴2018年7月开源的项目。
• 它专注于服务发现和配置管理领域 致力于帮助您发现、配置和管理微服务。Nacos 支持几乎所有主流类型的“服 务”的发现、配置和管理。
• 一句话概括就是Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。
• 官网:https://nacos.io/
• 下载地址: https://github.com/alibaba/nacos/releases
依赖:
<!--nacos-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.0</version>
</dependency>
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置nacos 服务端地址
application:
name: nacos-consumer # 服务名称
Ribbon 客户端负载均衡(了解)
Ribbon 概述
eureka集成Ribbon,使用不需要导入依赖
Ribbon 远程调用
- Ribbon 可以简化RestTemplate 的远程调用
1.在声明restTemplate的Bean时,添加一个注解@LoadBalanced
2.在使用restTemplate发起请求时,需要定义url时,host:port可以替换为服务提供方的应用名称
Ribbon 负载均衡
- 怎么修改负载均衡策略(默认轮询策略)
1.注解方式
@RibbonClient(name="服务提供方 应用名称",configuration=MyRule.class//设置负载均衡的策略类Bean)
2.配置方式