springcloud项目搭建教程【详细版】

一,前言

在当今这个快速变化的技术时代,软件开发模式也在不断进化。传统的单体应用已经满足不了一些场景的使用了,从而引入了微服务这一概念,微服务架构的产生,这不仅仅是技术上的革新,更是一种思维方式的转变。微服务架构以其高度的灵活性、可扩展性和容错性,正逐渐成为构建现代复杂系统的新标准。

二,微服务的基本组成部分

1.服务注册中心

服务注册中心是微服务架构中的关键组件,用于管理和维护所有服务的地址信息。常见的服务注册中心包括Eureka、Nacos,Consul和Zookeeper等。服务启动时会向注册中心注册自己的地址信息,其他服务需要调用该服务时,通过注册中心获取其地址。

2.配置中心

配置中心用于集中管理和动态更新微服务的配置信息。通过配置中心,可以在不重启服务的情况下修改配置,从而提高系统的灵活性和响应速度。常见的配置中心包括Spring Cloud Config和Apollo。

3.Api网关

API网关作为微服务架构的入口点,负责接收外部请求并将其路由到相应的后端服务。API网关还可以提供负载均衡、身份验证、请求转换等功能。常见的API网关实现包括Spring Cloud Gateway、Netflix Zuul和Kong。

4.远程调用

服务之间的通信是微服务架构中的核心部分,它决定了服务如何协同工作以完成复杂的业务流程。远程调用可以借助消息中间件,也可以基于相关的框架,常用的消息中间件有RabbitMq,RocketMq,Kafka,RedisMq等,一般用于异步通信,常用的框架有Double,Fegin,Grpc,Netty等框架,常用于实时性安全性较高的同步通信。

5. 负载均衡

负载均衡由客户端决定请求哪个服务实例,通常与服务发现结合使用,用来减轻高强度的请求,从而降低每个服务的压力,一般常见的使用的是Ribbon,Nginx。

三,如何搭建一个springCloud项目

1.环境准备及项目介绍

在这里插入图片描述

项目介绍
* cloud-gateway:网关微服务
* cloud-order订:单微服务
* cloud-product:商品微服务
* cloud-user:用户微服务
* fegin-api:远程调用公共组件

此处使用的是SpringCloudAlibaba作为微服务的注册中心和配置中心,使用Fegin作为远程调用,使用SpringCloudGateWay作为Api网关,负载均衡使用的是Ribbon,所以在开始前我们需要下载好Nacos组件,方便后面的开发(此处只搭建基本的环境,不做业务的扩展,如需其他的组件,后续加入即可)

2.创建一个maven空项目

在这里插入图片描述
去除无用的一些目录,只保留pox文件
在这里插入图片描述

3.加入版本控制

修改pom文件内容:
在这里插入图片描述

<?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</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-parent</artifactId>
        <version>2.3.9.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
        <mysql.version>8.0.20</mysql.version>
        <mybatis.version>2.1.3</mybatis.version>
        <alibaba.fastjson>1.2.75</alibaba.fastjson>
        <alibaba.cloud>2.2.6.RELEASE</alibaba.cloud>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- springCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- mysql驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${alibaba.fastjson}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <type>pom</type>
                <scope>import</scope>
                <version>${alibaba.cloud}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>

</project>

为了更好的管理整个微服务项目,此处我们需要对一些依赖做版本控制,以防止不同服务之间的同一个依赖项出现不同的版本的情况,此外,还引入了一些共用的依赖,由于依赖的传递性,在此处做引入,其他的地方就不需要再次引入了(用于一些比比较常用的依赖项,如lombok,fastjson这一类)。

4.创建微服务

1.创建微服务

在这里插入图片描述

在这里插入图片描述
点击creat创建
在这里插入图片描述
降低jdk版本
在这里插入图片描述

先去除无用的文件(看个人情况)
在这里插入图片描述
得到项目结构
在这里插入图片描述
加入模块
在这里插入图片描述

在这里插入图片描述

  <modules>
        <module>cloud-gateway</module>
    </modules>
    <packaging>pom</packaging>

修改子模块cloud-gateway
在这里插入图片描述

在这里插入图片描述

    <parent>
        <groupId>org.example</groupId>
        <artifactId>cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

重复上述操作创建处下面的相关服务
在这里插入图片描述
检查一下
在这里插入图片描述

在这里插入图片描述

2.搭建nacos的环境

启动nacos服务在这里插入图片描述

进入到cmd环境运行
在这里插入图片描述

在这里插入图片描述

startup.cmd -m standalone

启动
在这里插入图片描述
进入nacos的web端
在这里插入图片描述

地址:localhost:8848/nacos,此处无需登录,如果需要登录,默认的用户名和密码都是nacos
新建命名空间(主要起环境隔离的作用,不同命名空间不能相互访问)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
搭建配置中心配置文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
同理配出其他的环境,并设置端口号
在这里插入图片描述

3.配置网关微服务

在这里插入图片描述
引入相关依赖
在这里插入图片描述

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.example</groupId>
       <artifactId>cloud</artifactId>
       <version>1.0-SNAPSHOT</version>
   </parent>


   <groupId>com.example</groupId>
   <artifactId>cloud-gateway</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <properties>
       <java.version>1.8</java.version>
   </properties>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>

       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       </dependency>
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-gateway</artifactId>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

</project>

刷新依赖
在这里插入图片描述
重命名配置文件增加优先级
在这里插入图片描述
在这里插入图片描述

插入nacos配置
在这里插入图片描述
此处的配置应和上面nacos的配置文件名的相关信息对应,不然就会读取不到
服务名-开发环境.yaml

spring:
  application:
    name: cloudGateway # 服务名称
  profiles:
    active: dev #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      discovery:
        namespace: 自己的命名空间地址
      config:
        file-extension: yaml # 文件后缀名
        namespace: 自己的命名空间地址

在这里插入图片描述
测试一下
在这里插入图片描述
此处端口已经切换了,说明配置中心生效了
在这里插入图片描述
在这里插入图片描述
此处服务注册成功,说明注册中心配置成功
在这里插入图片描述
配置网关路由
在这里插入图片描述
在这里插入图片描述

server:
  port: 8089
spring:
  cloud:
    gateway:
      routes: # 网关路由配置
        - id: cloud-Order  # 路由id,自定义,只要唯一即可
          uri: lb://cloudOrder # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/order/** # 这个是按照路径匹配,只要以/order/开头就符合要求,此处配置了。后面相应的服务就要与这个路径开头,才能转发到相应的服务
        - id: cloud-User 
          uri: lb://cloudUser 
          predicates: 
            - Path=/user/** 
        - id: cloud-Product 
          uri: lb://cloudProduct
          predicates: 
            - Path=/product/** 

发布
在这里插入图片描述

4.配置其他服务

** 订单服务**
加入注册中心和配置中心的配置(此处我只讲主体的框架,对于其他的依赖按需要加入,对于公共性的依赖,加入到父模块中更好管理)在这里插入图片描述

      <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       </dependency>
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

加入nacos的配置
在这里插入图片描述

spring:
application:
 name: cloudOrder # 服务名称
profiles:
 active: dev #开发环境,这里是dev
cloud:
 nacos:
   server-addr: localhost:8848 # Nacos地址
   config:
     file-extension: yaml # 文件后缀名
     namespace: 41eb9ea4-fb53-4e5a-ad1c-26b4b8718404
   discovery:
     namespace: 41eb9ea4-fb53-4e5a-ad1c-26b4b8718404

创建基本的包结构
在这里插入图片描述
编写一个简单的测试案列
在这里插入图片描述
搭建基本的环境配置在这里插入图片描述
配置前缀,点击发布
在这里插入图片描述

server:
port: 8086  
servlet:
  context-path: /order

简单测试
启动服务
在这里插入图片描述
端口配置成功,服务注册成功
在这里插入图片描述
在这里插入图片描述
测试
没有走网关路由
在这里插入图片描述
走网关路由
在这里插入图片描述
测试成功
对于其他服务也像order一样的去配置,但是应记得服务名和前缀的配置和修改
重复上面的配置得到如下
在这里插入图片描述
在这里插入图片描述
此时微服务基本搭建成功

5.搭建服务间的调用

新建一个模块,建立如下包结构
在这里插入图片描述
加入依赖
在这里插入图片描述

      <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-openfeign</artifactId>
       </dependency>

       <dependency>
           <groupId>io.github.openfeign</groupId>
           <artifactId>feign-httpclient</artifactId>
       </dependency>

编写fegin接口
在这里插入图片描述

package org.example.client.orderClient;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
* @author: poet_Dai
* @create: 2024-11-23 16:24
* @Description:
*/
@FeignClient("cloudOrder")
@RequestMapping("/v1/order")
public interface TestOrderClient {
   @PostMapping("/get")
   public String get();
}

服务调用:此次由cloudUser服务调用cloudOrder服务
cloudUser端
导入公共模块api-fegin的依赖
在这里插入图片描述

     <dependency>
            <groupId>org.example</groupId>
            <artifactId>fegin-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

配置api-fegin的包扫描路劲(适用于包路径与服务方的路劲不匹配的情况,如果匹配可以不配置)
在这里插入图片描述

package com.example.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients(basePackages = "org.example.client")
public class CloudUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudUserApplication.class, args);
    }

}

引入fegin接口
在这里插入图片描述

package com.example.cloud.controller;

import org.example.client.orderClient.TestOrderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: poet_Dai
 * @create: 2024-11-23 16:18
 * @Description:
 */
@RestController()
@RequestMapping("/v1")
public class TestController {
    @Autowired
    private TestOrderClient testOrderClient;

    @PostMapping("/get")
    public String get(){
        return testOrderClient.get();
    }
}

启动服务测试
在这里插入图片描述
测试
在这里插入图片描述
成功
上面是关于fegin的使用,如果在一个服务中需要用到另一个服务的接口,我们就可以像上面那样去操作,实现服务与服务之间安定调用,此处的调用时属于同步调用,如果需要使用异步调用可以引入中间件,如rabbitmq,rocketmq这一类。

四,结语

通过上面的基本配置,我们就完成了一个基本微服务的搭建,但在实际开发过程中,这往往是不够的,还需要引入其他的配置,比如rabbitmq,minio,redis,mysql等一系列的中间件,此处我们只是搭建一个环境,后续的业务部分就需要看情况而加入。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值