0. 引言
上一期我们介绍了nacos作为注册中心、配置中心的使用方法,如果对于gateway、nacos组件还不了解的可以看看往期文章:
 springcloud:什么是分布式微服务,如何学习微服务(一)
 springcloud:微服务涉及哪些技术、有哪些核心组件(二)
 springcloud:网关组件gateway详解(三)
 springcloud:注册中心、配置中心组件nacos详解(四)
本期我们将手把手搭建一个微服务项目,来加深大家对于微服务框架的理解
1. 项目简介
项目开始搭建之前,我们先要明确,项目包含哪些内容:
 1、网关模块
 2、订单服务、商品服务
然后配置将订单服务、商品服务注册到nacos上,网关从nacos中获取服务列表,并且转发请求到具体的服务上
注意:本项目默认你已经掌握springboot框架,mysql,mybatis-plus,所以涉及这些技术点不做专门讲解,如果未掌握的可以先学习后再来看本篇文章。
2. 项目搭建
在项目搭建之前需要先安装好nacos、mysql、jdk
我的本机环境:
jdk1.8
springboot2.3.7.RELEASE
nacos2.0.3
mysql8.0
 
提前导入数据库order_test.sql,该文件已放在git项目地址中的根项目的doc文件夹中
2.1 根项目搭建
首先要创建一个根项目,这个根项目是个空项目,主要用于统一管理其他服务。同时为了方便后续的演示,我们会在根项目下再创建一个空项目,用于本期的项目演示。后续的项目实战就也在根项目下创建了。也方便大家拉取代码
1、创建一个空maven项目,无需选择其他依赖,命名为cloud-study
 
 2、删除项目下的src目录,仅保留一个pom文件
3、然后再在这个项目目录下再创建一个子模块,并且也是空项目,这个空项目就包含我们本次演示的所有代码,下一次演示时再单独创建一个子模块来承装
选中根项目>右键>new>Module
 
 无需选择其他内容,就创建一个空maven项目,命名为springcloud1。同样删除src目录。
 
 在根项目的pom中添加上springcloud1的模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>cloud-study</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <modules>
        <module>springcloud1</module>
    </modules>
</project>
 
2.2 创建网关服务
1、在springcloud1下新建子模块,项目类型选择springboot,项目命名为gateway
 
 2、添加gateway、nacos依赖,这里选择的springboot版本是2.3.7
 
 3、删除其他不需要的文件
 
 4、修改配置文件application.properties,并将其修改为.yml格式的
# 应用名称
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
          enabled: true
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: localhost:8848
        # 如果是public就不用填写了
        namespace:
# 应用服务 WEB 访问端口
server:
  port: 80
 
5、gateway启动类上添加@EnableDiscoveryClient注解,如果项目自动创建了nacos配置类NacosDiscoveryConfiguration的话,就不用再添加这个注解了,因为该配置类中已经添加了
6、在gateway的pom中添加上gateway的module
<modules>
        <module>gateway</module>
</modules>
 
2.3 创建订单服务
1、在springcloud1下创建springboot项目,命名order-server。并引入如图所示依赖
 
 2、修改配置文件application.yml
server:
    port: 8081
# 应用名称
spring:
    application:
      name: order-server
    cloud:
      nacos:
        discovery:
          username: nacos
          password: nacos
          server-addr: localhost:8848
          # 如果是public,就不用填了
          namespace: 
    datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      name: defaultDataSource
      url: jdbc:mysql://localhost:3306/order_test?serverTimezone=UTC
      username: root
      password: 123456
 
3、创建实体类order,注意order是sql关键字,所以声明数据表名时要添加上``将order括起来
@TableName("`order`")
@Data
public class Order { 
    private Long id;
    private String orderNo;
    private Date createTime; 
}
 
4、创建mapper,service,controller等,具体创建步骤省略,详细代码可到git下载项目查看。其中controller提供一个list接口
@RestController
@AllArgsConstructor
public class OrderController {
    private final IOrderService orderService;
    @GetMapping("list")
    public List<Order> list(){
        return orderService.list();
    }
}
 
2.4 创建商品服务
1、springcloud1下创建一个springboot项目,命名为product-server,并引入如图依赖
 
 2、修改配置文件application.yml
server:
  port: 9091
# 应用名称
spring:
  application:
    name: product-server
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: localhost:8848
        # 如果是public的话,就不用填了
        namespace: 
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    name: defaultDataSource
    url: jdbc:mysql://localhost:3306/order_test?serverTimezone=UTC
    username: root
    password: 123456
 
3、创建实体类
@Data
public class Product {
    private Long id;
    private String name;
    private String no;
    private Double price;
    private Date createTime;
}
 
4、mapper,service等代码省略,项目git中可以查看。controller中添加list接口
@RestController
@AllArgsConstructor
public class ProductController {
    private final IProductService productService;
    @GetMapping("list")
    public List<Product> list(){
        return productService.list();
    }
}
 
3. 测试
1、运行gateway,order-server,product-server项目
2、查看nacos,服务列表中会发现服务已经注册上来了
 
 3、测试订单服务请求转发,访问 http://localhost/order-server/list
可以看到我们正常获取到了订单的数据,我们访问的是80端口,订单服务实际是8081端口,通过网关的服务名实现动态路由转发,从而使得我们的请求最终打到了order-server上
 
 4、测试商品服务,访问 http://localhost/product-server/list
 
 如上所示,我们的网关和注册中心就配置成功了。但是还有一点,目前我们的配置文件还只是写在
4. 将配置文件上传到配置中心
1、如果项目创建时引入了nacos-config依赖的话,会在项目中创建一个bootstrap.properties文件,里面配置的就是nacos config配置文件,如果没有的话,就创建一个,有的话将配置文件修改为以下内容:
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.cloud.nacos.config.file-extension=yaml
spring.profiles.active=dev
 
2、在nacos中创建配置文件
 order-server-dev.yaml
 
 product-server-dev.yaml
 
 3、修改product-server配置文件application.yml
 将文件名修改为application-dev.yml。如果有测试环境和生产环境,可以分别创建application-test.yml,application-prod.yml配置文件,分别对应测试环境和生产环境配置文件,然后用命名空间来区分。
将配置文件内容修改为:
server:
  port: 9091
# 应用名称
spring:
  application:
    name: product-server
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: localhost:8848
        namespace:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    name: defaultDataSource
    url: ${spring.datasource.url}
    username: ${spring.datasource.username}
    password: ${spring.datasource.password}
 
4、同理修改order-server服务的配置文件,文件名修改为application-dev.yml
server:
    port: 8081
# 应用名称
spring:
    application:
      name: order-server
    cloud:
      nacos:
        discovery:
          username: nacos
          password: nacos
          server-addr: localhost:8848
          namespace:
    datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      name: defaultDataSource
      url: ${spring.datasource.url}
      username: ${spring.datasource.username}
      password: ${spring.datasource.password}
 
5、重启服务后,访问http://localhost/product-server/list和http://localhost/order-server/list,如果访问正常则说明配置成功了
 
 6、测试、生产环境如何切换配置文件,测试环境运行时需要指定启动参数spring.profiles.active=test,这样才能让配置文件切换为测试环境
5. 总结
到现在针对微服务框架的最核心组件就讲解完了,了解到这里是不是觉得微服务框架其实也没有那么神秘那么难,任何复杂的技术都是由简入深。
我们能够掌握住核心的组件,在工作中就可以承担其一个服务的开发任务了。注意学习千万不要停留在纸上谈兵,一定要自己去动动手,可以参考这篇博客,自己尝试着去搭建。不要一上来就去看git的代码。
自己搭建的过程中,哪怕是一步一步照着文章搭建的,肯定也会遇到各种各样的问题,有报错不要着急,细心的去排查,记录下每个报错以及最终的解决方法。慢慢的,你就会发现自己的成长了。
最后附上本次项目的代码
6. 项目代码下载
项目git地址
下期预告
1、微服务框架进阶讲解
关注公众号,了解更多新鲜内容











