微服务
微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力
- 面向服务:微服务对外暴露业务接口
- 自治:技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
Eureka注册中心(服务端)
- EurekaServer:eureka服务端,注册中心:记录服务信息,心跳监控
- EurekaClient:客户端:provider服务提供者,向eureka注册,30s向eureka发送新跳;
consumer消费者:从eureka拉去服务列表,基于负载均衡做远程调用
Eureka使用
Eureka使用服务搭建
1.依赖
父工程依赖管理
<properties>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子工程
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.主启动类添加注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
3.yml配置文件
server:
port: 10086
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
Eureka服务注册(客户端)
1.依赖
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.yml配置
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
服务发现
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
Ribbon负载均衡
负载均衡策略
- 默认zone:区域轮询
- 轮询
- 随机
- 加权
自定义负责均衡策略
1
@Bean
public IRule randomRule() { return new RandomRule();}
2
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients:
- userservice
- userservice2
Nacos注册中心
nacos服务
下载nacos解压启动
nacos客户端
1.依赖 父工程依赖
<dependencyManagement>
<!-- springCloudAlibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
添加nacos的客户端依赖:
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.yml配置
spring:
application:
name: userservice
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
nacos分级存储模型
- 一级是服务,如:userservice;
- 二级是集群;
- 三级是实例
服务集群属性设置
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: NJ # 设置集群名称
效果
Nacos负载均衡策略
配置(不配做默认全部轮询)
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
NacosRule负载均衡策略
- 优先选择同集群服务实例列表
- 本地集群找不到提供者,才去其它集群寻找,并且会报警告
- 确定了可用实例列表后,再采用随机负载均衡挑选实例
权重配置
配置在0~1之前,权重越大调用概率越大,设置为0则不会被调用
Nacos环境隔离
namespace -> group ->service
配置namespace命名空间 (只调用相同namespace服务)
1.nacos页面配置
2,yml文件配置
spring:
application:
name: orderservice
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: NJ # 设置集群名称
namespace: bada8b5d-a0bf-4b37-a824-3208cf03b66d #命名空间配置
Nacos服务维护
设置非临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别 - 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式