本文使用spring cloud,nacos,dubbo,gateway搭建微服务。

启动nacos

nacos是阿里开源的一个组件,用于服务发现、注册中心与配置中心。

首先下载nacos server:https://github.com/alibaba/nacos

解压压缩包,打开bin目录。因为直接启动的话,会以集群模式启动,单机下会报错。所以有三种方法解决:

  1. 使用命令行启动,指定为单机模式:

    startup.cmd -m standalone
    
  2. 修改startup.cmd文件,将其修改为单机模式:

    set MODE="cluster"
    

    修改为:

    rem set MODE="cluster"
    set MODE="standalone"
    

    注: rem为注释语句

  3. 可以去修改数据库配置,感觉太麻烦了

建议第一种。

然后便能直接启动。

web页面地址为:http://localhost:8848/nacos/index.html

默认账号密码都是nacos

项目搭建

开始搭建项目

新建一个父项目,名为cloud-demo

删掉多余的src目录。

然后再分别新建Module类型的项目,分别命名为provider、consumer、gateway,依赖选择Spring Web。

在父pom.xml文件中,引入子模块:

<packaging>pom</packaging>
<modules><module>consumer</module><module>gateway</module><module>provider</module>
</modules>

再新建一个公共子模块,命名为common。分别在provider、consumer子模块的pom.xml文件中引入common模块的依赖:

<dependency><groupId>com.wtsm</groupId><artifactId>common</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

因为每个子模块都需要引入配置中心和注册中心,所以在common和gateway模块中引入相应的依赖:

<!-- 配置管理 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2021.1</version>
</dependency><!-- 服务发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.1</version>
</dependency>

在application.yml同目录下,新建一个名为bootstrap.yml的资源文件,并保持application.yml为空。对gateway的bootstrap.yml配置文件进行配置:

# bootstrap.yml
spring:application:name: consumercloud:nacos:config:server-addr: http://localhost:8848group: test   file-extension: yaml

注:spring.application.name为nacos配置中心中dataId的一部分。 group为分组名。 file-extension为配置中心配置文件的扩展名。

然后在nacos的web管理页面的配置管理,新建一个配置。 Data Id填写上面spring.applicatio.name的值, Group即为上面的 group,配置格式选择YAML,配置内容填写需要放在配置中心的配置,这里填写运行端口与注册中心的地址:

server:port: 8082
spring:application:name: consumercloud:nacos:discovery:server-addr: http://localhost:8848

bootstrap.yml会比application.yml先加载,但是要使用bootstrap.yml配置文件的话,需要添加依赖,这里我们在common和gateway中添加:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.4</version>
</dependency>

先启动consumer模块,能看到程序以配置中心配置的8082端口运行,并且在服务列表能看到consumer服务

说明配置中心与注册中心都连接成功。

同理,对provider配置bootstrap.yml和配置中心配置:

# bootstrap.yml
spring:application:name: providercloud:nacos:config:server-addr: http://localhost:8848group: testfile-extension: yaml
server:port: 8083
spring:application:name: providercloud:nacos:discovery:server-addr: http://localhost:8848

同理,对gateway配置bootstrap.yml和配置中心配置

spring:application:name: gatewaycloud:nacos:config:server-addr: http://localhost:8848group: testfile-extension: yaml
server:port: 8081
spring:application:name: gatewaycloud:nacos:discovery:server-addr: http://localhost:8848

启动服务

使用idea快捷键alt+8,打开Services界面,添加服务


把多余的隐藏,剩这三个:

启动时发现报错了。

***************************
APPLICATION FAILED TO START
***************************Description:Your project setup is incompatible with our requirements due to following reasons:- Spring Boot [2.5.5] is not compatible with this Spring Cloud release trainAction:Consider applying the following actions:- Change Spring Boot version to one of the following versions [2.3.x, 2.4.x] .
You can find the latest Spring Boot versions here [https://spring.io/projects/spring-boot#learn].
If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section.
If you want to disable this check, just set the property [spring.cloud.compatibility-verifier.enabled=false]

这是因为所引入的Spring Cloud Alibaba和spring boot版本不符合,因为我用Spring Cloud Alibaba版本为2021.1,根据Spring Cloud Alibaba官方版本说明,需要将spring boot的版本改为2.4.2。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.2</version><relativePath/> <!-- lookup parent from repository -->
</parent>

能看到启动成功

到nacos页面,能看到注册成功的服务


测试nacos的配置自动刷新:

新增一个类:

@RestController
@RequestMapping("/config")
@RefreshScopepublic class ConfigController {@Value("${local:false}")private boolean local;@RequestMapping("/get")public boolean get() {return local;}
}

访问http://localhost:8082/config/get,得到结果为false

然后在配置中心,添加 local: true,结果为:

server:port: 8082
spring:cloud:nacos:discovery:server-addr: http://localhost:8848
local: true

在不重启应用的情况下,再次访问链接,得到的结果为true。说明配置确实动态刷新了。

集成dubbo

dubbo也是由阿里巴巴开源的一个微服务开发框架,可用于微服务之间的RPC通信。

需要使用dubbo的话,需要在common中引入依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>2021.1</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>

注:

  1. 如果不引入commons-lang3的话会报错: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils。但是在2018年的时候就提示已经移除了commons-lang3,详见https://github.com/apache/dubbo/pull/1921,而且spring-cloud-starter-dubbo的2021.1中使用的dubbo时2.7.8的,版本时间是2020年。理应没这个问题才对,很奇怪。
  2. 如果引入下面的dubbo的话,
<!-- dubbo -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.0.3</version>
</dependency>

虽然不会报commons-lang3的错,但是在使用consumer调用远程接口时,会提示远程方法为null: java.lang.NullPointerException: null,且查看provider服务的元数据时,只有 preserved.register.source=SPRING_CLOUD,正常来说,应该如下图所示:

在配置中心为consumer添加dubbo的配置:

server:port: 8082
spring:application:name: consumercloud:nacos:discovery:server-addr: http://localhost:8848
dubbo:application:name: consumerqos-enable: falseprotocol:name: dubboport: -1 # rpc需要一个额外的端口,-1表示端口随机registry:address: spring-cloud://localhostcloud:subscribed-services: providerconsumer:check: false

在配置中心为provider添加dubbo的配置:

server:port: 8083
spring:application:name: providercloud:nacos:discovery:server-addr: http://localhost:8848dubbo:application:name: providerqos-enable: false #不启用qos,启用的话会报端口被占用scan:base-packages: com.wtsm.provider.service  #Dubbo服务实现类的扫描基准包路径protocol:name: dubboport: -1registry:address: nacos://localhost:8848

新增一个子模块,命名为provider-api。在改模块中新建一个接口IProviderService:

public interface IProviderService {String getProvider();
}

分别在consumer和provider增加provider-api的依赖:

<dependency><groupId>com.wtsm</groupId><artifactId>provider-api</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

在provider中实现IProviderService接口:

import com.wtsm.providerapi.IProviderService;
import org.apache.dubbo.config.annotation.DubboService;@DubboService
public class ProviderServiceImpl implements IProviderService {@Overridepublic String getProvider() {return "调用服务成功";}
}

在consumer中调用接口:

import com.wtsm.providerapi.IProviderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope
public class ConsumerController {@DubboReferenceprivate IProviderService providerService;@GetMapping("getProvider")public String getProvider(){return providerService.getProvider();}
}

运行consumer和provider服务,访问http://localhost:8082/getProvider,能看到调用成功

集成网关

注释掉gateway模块的 spring-boot-starter-web依赖,然后在gateway模块中引入 spring-cloud-starter-gateway依赖,因为spring-cloud-starter-gateway内部实现的webflux与spring mvc的配置所冲突。

如果使用 lb,但不添加spring-cloud-starter-loadbalancer依赖的话,会报503的错。详见

nacos+spring cloud gateway 出现503 Service Unavailable_wangzibai的博客-CSDN博客

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>3.0.4</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>3.0.4</version>  <!-- 版本号是必须要加的 -->
</dependency>

然后在gateway的配置文件中,新增配置:

spring:cloud:gateway:routes:- id: consumer_route# uri后面指定消费者的服务id,lb代表从注册中心获取服务,lb是Load Balance的缩写uri: lb://consumerpredicates:# 匹配转发路径- Path=/**

将所有服务启动后,访问 http://localhost:8081/getProvider,会转发到consumer微服务中。

参考

蝉鸣又初雪 - 简书

Nacos Spring Cloud 快速开始

SpringCloud+Dubbo+Nacos整合实现RPC调用

Spring Cloud Config

使用spring cloud,nacos,dubbo,gateway搭建微服务相关推荐

  1. Spring Cloud Alibaba 学无止境:下一代微服务架构的规划与展望

    终于到了课程的最后一讲,本讲我们将对整个微服务架构和 Spring Cloud Alibaba 进行总结和展望.Spring Cloud Alibaba 是优秀的国产微服务架构解决方案,在基于 Spr ...

  2. spring cloud java b2b2c o2o分布式 微服务电子商务平台

    大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 需要JAVA Spring Cloud大型企业分布式 ...

  3. Dubbo将积极适配Spring Cloud生态,Spring Cloud体系或将成为微服务的不二选择!

    2016年,我在博客中发表过一篇<微服务架构的基础框架选择:Spring Cloud还是Dubbo?>(http://blog.didispace.com/microservice-fra ...

  4. spring解耦_云端时代的解耦:使用Spring Cloud Azure构建云端原生微服务

    spring解耦 重要要点 云本机应用程序应充分利用云的优势,而不仅仅是迁移到云中 通过在云计算环境上运行,微服务与云原生环境并驾齐驱 集中配置,服务发现,异步消息驱动和分布式跟踪是微服务基础架构 S ...

  5. Spring Cloud 云架构下的微服务架构:部门微服务(Dept)

    作者 | springML 来源 | CSDN 博客 责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 封图| CSDN下载于视觉中国 对于 Rest 基础架构实现处理是 S ...

  6. 艾艾贴关于Spring Cloud大型互联网分布式企业微服务云架构

    第一篇文章简单给大家介绍了Spring Cloud架构,我这边结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out.作 ...

  7. Spring Cloud应用接入华为云微服务CSE

    概述 Spring Cloud应用可以方便的接入CSE提供的基础服务.接入CSE服务有如下好处: 开发者可以专注于业务系统的开发,把精力从中间件的可靠性评估.集群部署.运维监控等复杂的事情中解放出来. ...

  8. 疯狂Spring Cloud连载(29)微服务跟踪概述

    本文节选自<疯狂Spring Cloud微服务架构实战> 京东购买地址::https://item.jd.com/12256011.html 当当网购买地址::http://product ...

  9. Spring Cloud【Finchley】- 21 Spring Cloud Stream 构建消息驱动微服务

    文章目录 概述 添加依赖 配置文件配置RabbitMQ的地址信息 接口定义 接收方 @EnableBinding @StreamListener 测试 消费组 发送复杂对象 消息回执 代码 概述 官网 ...

  10. winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] [编者的话]如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构.本文 ...

最新文章

  1. 交叉熵损失函数、修正Huber损失、极大似然估计、负对数似然、似然与交叉熵、KL散度
  2. 报错解决:DB::Exception: Scalar subquery returned more than one row.
  3. 创建数据库指定编码集
  4. 把玩Alpine linux(二):APK包管理器
  5. 在运行时访问工件的Maven和SCM版本
  6. [NHibernate] NHibernate对象关系映射工具了解
  7. leetcode1053. 交换一次的先前排列(贪心算法)
  8. [密码学][困难问题][常见规约]密码学问题常见困难问题
  9. c语言delay_单片机模拟流星雨,电路图和程序,一起来感受下,其实C语言不难...
  10. Lyft出售自动驾驶部门给丰田子公司:作价5.5亿美元
  11. 关于最新版FCKeditor上传漏洞错误解决办法
  12. 跨域解决方案CROS最简单演示——JSP演示示例
  13. oracle das系统,分布式声波传感系统DAS
  14. 帆软填报联动 控件联动的几种方式
  15. ffmpeg 音乐循环_背景音乐自动循环播放
  16. RedHat 7 更换 yum 源为 CentOS 或网易镜像源
  17. Java飞机大战项目实战
  18. 面试软件测试的时候,应届生怎么包装自己的简历?
  19. background 属性介绍
  20. 中国居民身份证号码检验程序

热门文章

  1. 蓝桥杯2015年第六届C/C++省赛B组第二题-星系炸弹
  2. 7-6 查找整数 (10 分)
  3. L1-020 帅到没朋友 (20 分) — 团体程序设计天梯赛
  4. 用Python玩转微信(一)
  5. 记录一下----关于设计模式和面向对象设计原则
  6. linux学习笔记(11)df命令
  7. Linux安装Oracle,卡在60%处的解决方法
  8. 编程一年来的疑惑和思考
  9. Bugku杂项小猪佩奇思路
  10. 使用sublime实现python代码补全