栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCound-Alibaba

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCound-Alibaba

Nacos Nacos的下载

地址: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我们要添加一些配置,实现模块启动时注册到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支持的通信协议
  • dubbo协议(默认)
  • rmi协议
  • hessian协议
  • http协议
  • webservice
  • …
支持的序列化协议
  • hessian2(默认)
  • java序列化
  • compactedjava
  • nativejava
  • fastjson
  • dubbo
  • fst
  • kryo

在Dubbo的调用过程中,必须包含注册中心的支持

常见面试题:Dubbo的注册发现流程

1.首先服务的提供者启动服务时,将自己的具备的服务注册到注册中心,启动包括当前提供者的ip地址和端口号等信息,Dubbo会同时注册该项目提供的远程调用的方法
2.消费者(使用者)启动项目,也注册到注册中心,同时从注册中心中获得当前项目具备的所有服务列表
3.当注册中心中有新的服务出现时,会通知已经订阅发现的消费者,消费者会更新所有服务列表
4.RPC调用,消费者需要调用远程方法时,根据注册中心服务列表的信息,只需服务名称,不需要ip地址和端口号等信息,就可以利用Dubbo调用远程方法了

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运算
以后每次相同参数的请求都会访问固定服务器因为根据参数选择服务器,不能平均分配到每台服务器上使用的也不多

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031544.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号