springcloud:保姆式教程-从零搭建微服务(五)

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

这里需要注意:一般我们创建配置文件的路径不与环境变量的路径同名,比如我这里使用的是spring.datasource.url实际上已经和环境变量同名了,但这里是为了方便演示,让大家看清楚对应关系,实际的时候我们一般会吧前缀改为框架名,比如blade.datasource.url

我这里nacos2.0.3版本实测配置文件的路径与环境变量的路径同名可以正常运行,但可能在更早之前的版本会存在问题,如果运行有问题,可以将配置的路径名改下
在这里插入图片描述
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、微服务如何通信?组件通信组件:feign详解
2、微服务框架进阶讲解

关注公众号,了解更多新鲜内容

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_24950043/article/details/123941988