地址:https://github.com/alibaba/nacos/releases/download/1.4.3/nacos-server-1.4.3.zip
Nacos的安装及启动(1)因为Nacos是java开发的,我们要启动Nacos必须保证当前系统配置了java环境变量,简单来说就是要环境变量中,有JAVA_HOME的配置,指向安装jdk的路径
(2)在cmd中定位到nacos文件中的bin路径,然后输入指令startup.cmd -m standalone打开nocos软件,运行成功默认占用8848端口,并且在代码中提示
(3)打开浏览器输入地址 http://localhost:8848/nacos会打开界面登录系统,输入用户名:nacos,密码:nacos进入后台列表
个项目要想称为微服务体系的一部分必须将当前项目的信息注册到Nacos我们要添加一些配置,实现模块启动时注册到Nacos的效果
(1)添加依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
(2)application-dev.yml中编写对nacos注册的配置信息
spring:
application:
# 为当前项目命名,这个名称会在nacos注册时使用
name: nacos-business
cloud:
nacos:
discovery:
# 定义Nacos所在的位置,方便当前项目提交信息
server-addr: localhost:8848
Nacos心跳机制
心跳机制的目的,是每个服务和Nacos保持沟通和交换信息的机制。
默认情况下,服务启动后每隔5秒会向Nacos发送一个"心跳包",这个心跳包中包含了当前服务的基本信息,Nacos接收到这个心跳包,首先检查当前服务在不在注册列表中,如果不在按新服务的业务进行注册,如果在,表示当前这个服务是健康状态,如果一个服务连续3次心跳(默认15秒)没有和Nacos进行信息的交互,就会将当前服务标记为不健康的状态,如果一个服务连续6次心跳(默认30秒)没有和Nacos进行信息的交互,Nacos会将这个服务从注册列表中剔除。
这些时间都是可以通过配置修改的
实际上Nacos的服务类型还有分类
- 临时实例(默认) - 持久化实例(永久实例):心跳包的规则和临时实例一致,只是不会将该服务从列表中剔除
默认每个服务都是临时实例
如果想标记一个服务为永久实例
cloud:
nacos:
discovery:
# ephemeral设置当前项目启动时注册到nacos的类型 true(默认):临时实例 false:永久实例
ephemeral: false
Dubbo
什么是RPC
RPC是Remote Procedure Call的缩写 翻译为:远程过程调用
目标是为了实现两台(多台)计算机服务器,相互调用方法通信的解决方案
RPC只是实现远程调用的一套标准
该标准主要规定了两部分内容
- 1.序列化协议:序列化协议指通信内容的格式,双方都要理解这个格式 - 2.通信协议Dubbo概述
Dubbo是一套RPC框架。既然是框架,我们可以在框架结构高度,定义Dubbo中使用的通信协议,使用的序列化框架技术,而数据格式由Dubbo定义,我们负责配置之后直接通过客户端调用服务端代码。
可以说Dubbo就是RPC概念的实现
Dubbo是SpringCloudAlibaba提供的框架
- dubbo协议(默认)
- rmi协议
- hessian协议
- http协议
- webservice
- …
- hessian2(默认)
- java序列化
- compactedjava
- nativejava
- fastjson
- dubbo
- fst
- kryo
在Dubbo的调用过程中,必须包含注册中心的支持
1.首先服务的提供者启动服务时,将自己的具备的服务注册到注册中心,启动包括当前提供者的ip地址和端口号等信息,Dubbo会同时注册该项目提供的远程调用的方法
2.消费者(使用者)启动项目,也注册到注册中心,同时从注册中心中获得当前项目具备的所有服务列表
3.当注册中心中有新的服务出现时,会通知已经订阅发现的消费者,消费者会更新所有服务列表
4.RPC调用,消费者需要调用远程方法时,根据注册中心服务列表的信息,只需服务名称,不需要ip地址和端口号等信息,就可以利用Dubbo调用远程方法了
将一个模块分为:1、远程调用接口模块。2、服务模块
在在生产者模块中设置:
(1)父子相认
(2)导入依赖
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
com.alibaba
druid
mysql
mysql-connector-java
cn.tedu
csmall-commons
0.0.1-SNAPSHOT
com.github.xiaoymin
knife4j-spring-boot-starter
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-dubbo
cn.tedu
csmall-stock-service
0.0.1-SNAPSHOT
(3)yml配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/csmall_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: 123456
application:
name: nacos-stock
cloud:
nacos:
discovery:
server-addr: localhost:8848
dubbo:
protocol:
# port设置-1是Dubbo框架支持的特殊写法
# 会自动动态生成可用的端口号,规则是从20880开始,如果被占用就递增使用
port: -1
# 设置连接名称,一般固定就叫dubbo
name: dubbo
registry:
# 声明注册中心的软件类型和ip端口号
address: nacos://localhost:8848
consumer:
# 当前项目启动时,作为消费者,是否要检查所有远程服务可用,false表示不检查
check: false
(5)将业务逻辑层实现类添加@DubboService注解,使方法声明为Dubbo可调用的方法
(6)还需要在SpringBoot启动类上添加@EnableDubbo的注解,才能真正让Dubbo功能生效
在在消费者模块中设置:
(1)添加依赖
com.alibaba.cloud spring-cloud-starter-dubbo cn.tedu csmall-stock-service 0.0.1-SNAPSHOT
(2)添加注解
当在调用时使用@DubboReference来代替@Autowired注解
例子:
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
@Autowired
private OrderMapper orderMapper;
// 当前order模块消费stock模块的减少库存的方法
// 因为stock模块减少库存的方法已经注册到Nacos,所以当前order模块可以利用Dubbo调用
// 要想调用就必须使用@DubboReference,才能获得业务逻辑层实现类对象
@DubboReference
private IStockService stockService;
// 还需要cart模块的服务,有的公司要求dubbo的业务层变量名用dubbo开头
@DubboReference
private ICartService dubboCartService;
@Override
public void orderAdd(OrderAddDTO orderAddDTO) {
// 1.减少订单商品的库存数(要调用stock模块的方法)
// 实例化减少库存业务的DTO并赋值
StockReduceCountDTO stockReduceCountDTO=new StockReduceCountDTO();
stockReduceCountDTO.setCommodityCode(orderAddDTO.getCommodityCode());
stockReduceCountDTO.setReduceCount(orderAddDTO.getCount());
// Dubbo调用业务逻辑层方法,减少库存
stockService.reduceCommodityCount(stockReduceCountDTO);
// 2.删除订单中勾选的购物车中的商品(要调用cart模块的方法)
dubboCartService.deleteUserCart(orderAddDTO.getUserId(),
orderAddDTO.getCommodityCode());
// 3.新增订单
OrderTb order=new OrderTb();
BeanUtils.copyProperties(orderAddDTO,order);
// 执行新增
orderMapper.insertOrder(order);
log.info("新增的订单信息:{}",order);
}
}
因为order模块也是生产者@EnableDubbo注解仍然要写
@SpringBootApplication
@EnableDubbo
public class CsmallOrderWebapiApplication {
public static void main(String[] args) {
SpringApplication.run(CsmallOrderWebapiApplication.class, args);
}
}
负载均衡
Dubbo内置4种负载均衡算法
random loadbalance:随机分配策略(默认) round Robin Loadbalance:权重平均分配 leastactive Loadbalance:活跃度自动感知分配 consistanthash Loadbalance:一致性hash算法分配
随机分配策略
随机生成随机数
在哪个范围内让哪个服务器运行
权重平滑分配:
活跃度自动感知
记录每个服务器处理一次请求的时间
安装时间比例来分配任务数,运行一次需要时多的分配的请求数较少
一致性Hash算法
根据请求的参数进行hash运算
以后每次相同参数的请求都会访问固定服务器因为根据参数选择服务器,不能平均分配到每台服务器上使用的也不多



