SpringBoot+Maven+Nacos搭建微服务应用

Posted 瀚岳-诸葛弩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot+Maven+Nacos搭建微服务应用相关的知识,希望对你有一定的参考价值。

1、创建微服务应用

理解:和创建多模块应用一样,只不过此处的各种方法不再是通过“类库”进行调用,而是通过服务(controller或service)

(1)按上图创建多模块项目(这块还没有深入理解,理论上应该不用这样创建,特别是对于一些公共的服务封装);

(2)serviceProvider为服务提供者,serviceCustomers为服务使用者

(3)主框架pom.xml如下(要特别注意版本的匹配,即:spring-boot和cloud-alibaba的匹配。各版本的匹配官网地址是:版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub):

<dependencyManagement>
    <dependencies>
        <!--Spring boot 依赖(定义了微服务规范)-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.3.2.RELEASE</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <!--Spring Cloud 依赖(定义了微服务规范)-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR9</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <!--Spring Cloud Alibaba依赖(基于spring微服务规范做了具体落地实现)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.6.RELEASE</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

serviceProvider和serviceCustomers的pom.xml继承了框架pom.xml内容,故:引入新增所需dependency就行,如下:

<dependencies>
    <!--Web服务-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--服务的注册和发现(我们要将服务注册到nacos)-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

(4)创建和配置serviceProvider

在src/main/resources/下创建application.yml配置文件,配置内容为(server-addr可以是localhost或127.0.0.1):

server:
  port: 8081
spring:
  application:
    name: serviceProvider
  cloud:
    nacos:
      discovery:
        server-addr: 10.190.129.25:8848

创建一个controller,写好一个对外发布的服务(即:RequestMapping)

(5)启动Nacos(怎么启动和配置,见上一篇内容),运行APP,正常运行后,应该可以看到Nacos已经成功注册服务:

如成功看到上图结果,那么就表示服务已经注册成功,可以被其它应用调用。

(6)从serviceCustomers中对服务进行调用

此处,使用了RestTemplate对服务进行请求,并返回结果。可以理解是一个封装了的工具类。详细细节:RestTemplate 用法详解_lzcWHUT的博客-CSDN博客_resttemplate

微服务的优点:

(1)项目与项目之间(modul之间)可以完全没有依赖关系,通过nacos进行服务管理。极大程度实现了各模块之间的最低耦合(这一点前后端分离后也可以实现);

(2)每一个项目都可以在nacos注册为服务提供者,供其他项目调用。那么,所有的部门、用户、角色,都可以通过调用主工程的controller实现。且由于是通过服务调用(不是引用jar的形式),主工程可以发布在任意服务器,子工程也可以发布在任意服务器,并实现调用(需要用到Feign,和跨域请求非常类似)。这与多模块程序不同的地方在于无需引用jar包,无需创建实例,直接调用服务(这一点通过分布式数据库+前后端分离也可以实现)。这样的好处在于:服务提供者更新后,子工程无需重启(一般情况下,MIS系统的服务提供者主要提供数据库的CRUD,返回的都是字符串,所以只要方法参数、名称不改变,服务调用者就不需要重新发布程序);

(3)方便配置策略均衡(这一点通过负载均衡也可以实现,但在Nacos这里容易配置一点,目前没有发现更进一步的优势)

在之前的serviceCustomers中,增加红下划线代码,即可从Nacos中获取压力较小(访问量较少)的服务

本地多实例启动,在IDEA中从如下接口进行配置:

配置完毕后,先运行一次serviceProvider,然后修改serviceProvider/src/resouces/application.yml中的port,再运行一次,如果要继续多运行,可多次修改port端口后运行,这样,在Nacos管理平台中可以看到注册了同名的多个服务实例,如下:

点击详情可看到:

运行serviceCustomers,可以看到每次刷新都会从实例中选择压力最小的一个。即下面这行代码其的作用:

这在并发过高时,可以将接口发布至多台服务器,并通过前端调用进行负载分配,有利于快速实现负载均衡。在VS中,也可以通过全局变量自己写策略满足上述应用需求,此处通过ServiceInstance方便了许多。ServiceInstance类的详细介绍:服务实例(Service Instance)生命周期如何控制_weixin_30549657的博客-CSDN博客

上述几点优势也可通过即有技术进行解决,也许是理解尚未深入的原因。但微服务作为目前主流解决方案,一定存在其优势,特别是Nacos经过了多年双11的考验,在并发和性能方面应该有很多独具优势的地方。

官网主要介绍为(尚未深入了解):

Sentinel – 提供流控、服务降级、熔断能力,为系统提供防护。

Nacos – 负责服务注册与发现,还有分布式配置。

RocketMQ – 用于实现事件驱动模式、消息总线,已经整合了 SpringCloud Stream。

Seata – 用于实现分布式事务。

Dubbo RPC – 使用 RPC 进行服务调用。

其它博文理解:

Nacos是什么_wh柒八九的博客-CSDN博客_nacos

以上是关于SpringBoot+Maven+Nacos搭建微服务应用的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud alibaba nacos搭建最小可运行微服务

微服务架构SpringBoot+SpringCloud+VUE三 || 服务注册与配置中心Nacos

SpringCloud学习4(Spring Cloud Alibaba)概念简介环境搭建注册中心Nacos

微服务分布式架构-gateway服务集成nacos

SpringBoot2 整合Nacos组件,环境搭建和入门案例详解

springboot微服务注册到nacos平台