一 相关概念
1.微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间一般通过 HTTP 的 RESTfuL API 进行通信协作。
2.被拆分成的每一个小型服务都围绕着系统中的某一项或些耦合度较高的业务功能进行构建,并且每个服务都维护着白身的数据存储、业务开发自动化测试案例以及独立部署机制。
3.由于有了轻量级的通信协作基础,微服务可以使用不同的语言来编写。
二 对微服务的理解
1.Spring Cloud 是一系列框架的有序集合。
2.Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来。
3.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
4.利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、 断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
5.Spring Cloud项目官方网址:Spring Cloud
6.Spring Cloud 版本命名方式采用了伦敦地铁站的名称,同时根据字母表的顺序来对应版本时间顺序,比如:最早的Release版本:Angel,第二个Release版本:Brixton,然后是Camden、Dalston、Edgware,Finchley,Greenwich,Hoxton,Ilford,Jubilee。目前最新的是Jubilee版本。
三 Spring Cloud 与 Dubbo 对比
1.Spring Cloud 与 Dubbo 都是实现微服务有效的工具。
2.Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件。
3.Dubbo 使用 RPC 通讯协议,Spring Cloud 使用 RESTful 完成通信,Dubbo 效率略高于 Spring Cloud。
四 小结
1.微服务就是将项目的各个模块拆分为可独立运行、部署、测试的架构设计风格。
2.Spring 公司将其他公司中微服务架构常用的组件整合起来,并使用 SpringBoot 简化其开发、配置。
3.Spring Cloud 与 Dubbo都是实现微服务有效的工具。Dubbo 性能更好,而 Spring Cloud 功能更全面。
五 Spring Cloud 服务治理组件
服务治理,即服务注册和服务发现。最常用的3个服务治理组件:Eureka、Consul、Nacos
六 Eureka
Eureka 是 Netflix 公司开源的一个服务注册与发现的组件 。
Eureka 和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起,被 Spring Cloud 社区整合为 Spring-Cloud-Netflix 模块。
Eureka 包含两个组件:Eureka Server (注册中心) 和 Eureka Client (服务提供者、服务消费者)。
Eureka 一共有4部分配置:
server : eureka 的服务端配置
client : eureka 的客户端配置
instance : eureka 的实例配置
dashboard : eureka 的web控制台配置
示例:
1.eureka server配置:
eureka:
instance:
hostname: localhost # 主机名
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
server:
enable-self-preservation: false # 关闭自我保护机制
eviction-interval-timer-in-ms: 3000 # 检查服务的时间间隔
2.eureka provider client配置:
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
lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包
lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
3.eureka consumer client配置:
eureka:
instance:
hostname: localhost # 主机名
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
name: eureka-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
4.eureka dashboard配置:
eureka:
dashboard:enabled: true # 是否启用eureka web控制台
path: / # 设置eureka web控制台默认访问路径
七 Eureka – 高可用
以2个Eureka Server实例为例:
1.准备两个Eureka Server;
2.分别进行配置,相互注册;
3.Eureka Client 分别注册到这2个 Eureka Server中 。
八 Consul
1.Consul 是由 HashiCorp 基于 Go 语言开发的,支持多数据中心,分布式高可用的服务发布和注册服务软件。
2.用于实现分布式系统的服务发现与配置。
3.使用起来也较 为简单。具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署 。
官网地址: Consul by HashiCorp
九 Nacos
1.Nacos(Dynamic Naming and Configuration Service) 是阿里巴巴2018年7月开源的项目。
2.Nacos专注于服务发现和配置管理领域,致力于帮助您发现、配置和管理微服务。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。
3.一句话概括就是Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。
4.官网:https://nacos.io/
十 Ribbon客户端负载均衡
1.Ribbon概述
Ribbon是 Netflix 提供的一个基于HTTP和TCP的客户端负载均衡工具。
2.Ribbon主要有两个功能:
(1) 简化远程调用
(2) 负载均衡
3.负载均衡
服务端负载均衡:
负载均衡算法在服务端
由负载均衡器维护服务地址列表
客户端负载均衡:
负载均衡算法在客户端
客户端维护服务地址列表
4.Ribbon负载均衡策略:
随机 :RandomRule
轮询 :RoundRobinRule
最小并发:BestAvailableRule
过滤:AvailabilityFilteringRule
响应时间:WeightedResponseTimeRule
轮询重试:RetryRule
性能可用性:ZoneAvoidanceRule
5.设置负载均衡策略的两种方式(选其一即可)
(1) 编码
定义一个规则类 MyRibbonRule,如下:
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRibbonRule {
@Bean
public IRule rule(){
//随机
return new RandomRule();
}
}
在对应的Configuration类中加注解 @LoadBalanced
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在Application类上添加注解 @RibbonClient
package com.xxx.consumer;
import com.xxx.consumer.config.MyRibbonRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@EnableDiscoveryClient // 激活DiscoveryClient
@EnableEurekaClient
@SpringBootApplication
/*
配置Ribbon的负载均衡策略 name
name:设置 服务提供方的 应用名称
configuration:设置负载均衡Bean
*/
@RibbonClient(name="EUREKA-PROVIDER",configuration = MyRibbonRule.class)
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class,args);
}
}
(2) 配置
在applicatioan.yml文件中配置:
# 配置的方式设置Ribbon的负载均衡策略
EUREKA-PROVIDER: # 设置的服务提供方的 应用名称
ribbon:
NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类