一款不错的SpringCloud 脚手架项目:注册中心(nacos)+RPC(feign)

458 阅读5分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

I 一款不错的SpringCloud 脚手架项目

1.1 项目概述

  • spring boot+spring cloud
  • 注册中心:nacos

  • 网关:gateway
  • RPC:feign

使用Feign的方式,进行微服务调用。

可插拔功能组件:

  • 流控熔断降级:sentinel
  • 全链路跟踪:sleth+zipkin 分布式事务:seata
  • 封装功能模块:全局异常处理、日志输出打印持久化、多数据源、鉴权授权模块、zk(分布式锁和订阅者模式)
  • maven:实现多环境打包、直推镜像到docker私服。

原文:springCloud 脚手架项目: https://mp.weixin.qq.com/s/tnXEmI2cstUQ4Ft-611W4w

关注gz号:iOS逆向,回复【SpringCloud】。

1.2 本地启动

  1. 本地启动nacos: http://127.0.0.1:8848
sh startup.sh -m standalone

启动成功之后,Nacos 默认端口是8848,浏览器中输入http://localhost:8848/nacos/ 即可进入登录页面,账号密码默认是 nacos/nacos。

关闭 Nacos:bin/shutdown.sh

Nacos 建议在内部隔离网络环境中部署,强烈建议不要部署在公共网络环境中。Nacos 属于微服务内部所使用的组件,是没有必要暴露在公网当中。

  1. 本地启动sentinel: http://127.0.0.1:9000
nohup java -Dauth.enabled=false -Dserver.port=9000 -jar sentinel-dashboard-1.8.1.jar &
  1. 本地启动seata: http://127.0.0.1:8091
nohup sh seata-server.sh &
  1. 本地启动zipkin: http://127.0.0.1:9411/
nohup java -jar zipkin-server-2.23.2-exec.jar &

II Nacos(Dynamic Naming and Configuration Service)

2.1 注册中心

使用注册中心,能够很好地实现服务治理、服务动态扩容,以及调用时能有负载均衡的效果,调用链路如下:

  • 服务提供者:每台服务提供者,会把自己本身的 ip + port 信息提供给注册中心。
  • 注册中心:会记录每台服务名称以及每台服务对应的 ip + port。
  • 消费者:订阅注册中心,根据服务名称,动态根据负载均衡策略选择其中一台 ip + port ,从而完成服务调用。

2.2 注册中心框架

Nacos 则是一款注册中心框架,脱胎于历经阿里巴巴10年生产验证的内部产品,更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

nacos.io/zh-cn/index…

在这里插入图片描述

Nacos 服务端其实就是一个SpringBoot项目,它也有Controller,它里面也会使用@RestController、@RequestMapping注解。

Nacos 提供了一个简洁易用的 UI 来帮助我们管理所有服务和应用的配置, Nacos 两个核心功能如下:

  • 服务管理: Nacos 提供了一套 Web 管理后台,可以根据 Namespace 命名空间、Group 分组来区分不同的项目、不同的环境,使用上更加灵活。
  • 配置管理:Nacos 可以让微服务配置中心化,采用外部化和动态化的方式管理所有环境配置和应用配置。

Nacos 客户端到底通过什么方式,往服务端发起注册的?

HTTP,Nacos 服务端会提供注册的 API 接口给客户端进行 HTTP 调用。

客户端在发起 服务注册 的期间,会开启一个 心跳健康检查 的延时任务,这个任务每间隔 5s 执行一次,任务内容就是会通过 HTTP 请求调用发送实例心跳接口,告诉 Nacos 服务端,我还活着,我这个服务当前还是可用的状态。

2.3 域名 + SLB 模式

域名是直接解析到负载均衡上,再由负载均衡选择具体 Nacos 实例来进行访问,这种架构也是 Nacos 官方推荐集群模式。

优点:可读性好,而且换 IP 方便。

不管是访问 Nacos 后台、还是微服务集成 Nacos,所使用的地址都是域名,因为域名变动性最小,哪怕域名背后的 IP 地址变更了,对于客户端来说是无感知的。

2.4 服务注册

  1. 在 pom.xml 文件中引入 Nacos 注册中心依赖:spring-cloud-starter-alibaba-nacos-discovery
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--nacos 配置管理依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. application.properties 中配置 Nacos 服务地址:
spring:
  application:name: stock-service
  cloud: 
      nacos:
          discovery:server-addr: http://4.223.102.236:8848

2.5 使用Feign进行微服务调用

// 指定微服务名称
@FeignClient(name = "stock-service")
public interface StockService {


    /**
     * 查询库存
     * @return
     */
    @GetMapping(value = "/stock/getStockByProductId")
    Integer selectStockByProductId(@RequestParam("productId") Integer productId);

}

2.6 集成 Nacos 配置中心服务

Nacos 对比其他注册中心多了一个配置中心,可以把微服务项目配置文件统一管理,并且能够做到无需重启项目,也能感知配置文件的修改。

@Data
@Component
@RefreshScope
public class User {

    @Value("${user.userName}")
    private String userName;

}
//@Value注解的意思就是从配置文件中去读取这个属性;
//@RefreshScope这个注解是表示动态刷新,动态感知配置文件变化,不加这个注解的话,修改 Nacos 上的配置文件,是不会有动态刷新的效果。
  1. 在 Nacos 管理中心创建对应配置文件。我们先打开 Nacos 后台,配置管理 → 配置列表,点击 + 号,创建一个新的配置文件。

  2. 引入配种服务依赖,现在我们还需要把 Spring Boot 项目集成 Nacos 配置中心服务,在 pom.xml 文件中,引入 Naocs 配置中心对应的 Maven 依赖。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

  1. 修改配置文件名,把配置文件的文件名改成 bootstrap.yml,默认是 application.yml。

  2. 配置 Nacos 配置服务信息:在 yml 文件中,新增 Nacos 配置中心相关配置:

spring:
    application:
        name: stock-service
        cloud:
            nacos:
                # 配置中心
                config:server-addr: http://4.223.102.236:8848
                    ## 配置文件前缀
                    prefix: stock-service
                    # 配置文件类型
                    file-extension: yml
                # 注册中心
                discovery:
                    server-addr: http://4.223.102.236:8848