SpringBoot实战(四)搭建SpringCloud微服务

文章地址:https://blog.csdn.net/qq_33204709/article/details/111068089

代码下载:https://download.csdn.net/download/qq_33204709/13684771

Spring Cloud 5个核心组件:

  • 注册中心——Netflix Eureka
  • 配置中心——Spring Cloud Config
  • 服务网关——Spring Cloud Gateway
  • 客户端负载均衡——Netflix Ribbon(待集成)
  • 断路器——Netflix Hystrix(待集成)

效果演示

本地访问地址:

  • http://localhost:1001 - 注册中心
  • http://localhost:1006/business - 业务中心
  • http://localhost:1003/business - 测试网关是否成功转发到业务中心

在这里插入图片描述

一、 创建spring-cloud-demo

1.创建spring-cloud-demo文件夹,新建pom.xml文件,文件内容:

<?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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.example</groupId>
  <artifactId>spring-cloud-demo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>demo-eureka</module>
    <module>demo-config</module>
    <module>demo-gateway</module>
    <module>demo-business</module>
  </modules>

  <properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring-cloud.version>Hoxton.M3</spring-cloud.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>

二、 集成demo-eureka

1.在IDEA编译器中,Ctrl + Shift + Alt + S -> Modules -> + -> New Module

在这里插入图片描述

2.选择 Spring Initializr -> JDK 8 -> Default -> Next

在这里插入图片描述

等待创建。。。

在这里插入图片描述

3.修改项目名称 -> 修改JDK版本 -> Next

在这里插入图片描述

4.直接下一步

在这里插入图片描述

5.可以修改模块名称、项目路径,如果没有需要改动的,直接点击完成。

在这里插入图片描述

6.等待Maven依赖下载。

在这里插入图片描述

7.删除多余的文件和文件夹,只保留 src 文件夹和 pom.xml 文件。

在这里插入图片描述

8.修改pom.xml文件内容如下:

<?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>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>demo-eureka</artifactId>
    <description>Eureka project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.M3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

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

</project>

9.添加@EnableEurekaServer

DemoEurekaApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * 注册中心 - Eureka
 *
 * @author ACGkaka
 */
@EnableEurekaServer
@SpringBootApplication
public class DemoEurekaApplication {

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

}

10.修改 application.properties 为 bootstrap.yml,内容如下:

server:
  port: 1001

eureka:
  instance:
    hostname: localhost
  client:
    # eureka.client.registerWithEureka :表示是否将自己注册到Eureka Server,默认为true。
    # 由于当前这个应用就是Eureka Server,故而设为false
    register-with-eureka: false
    # eureka.client.fetchRegistry :表示是否从Eureka Server获取注册信息,默认为true。
    # 因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。
    fetch-registry: false

**注意:**要修改编码格式为 UTF-8,不然项目启动会报错。

在这里插入图片描述

知识补充

为什么要使用 bootstrap.yml 而不使用 application.properties?

  • 文件名后缀不会影响配置文件的作用,主要在于bootstrap和application的区别;
  • bootstrap 在 application 之前生效,应用于程序启动时的上下文阶段;
  • 我们的项目中使用了Spring Cloud Config,需要在程序启动的时候让配置文件生效,从而加载到配置中心的配置文件,所以应该使用bootstrap.yml;
  • 否则,后面集成配置中心的时候会不生效。

11.项目结构图:

在这里插入图片描述

12.测试项目是否可以启动成功

在这里插入图片描述

访问 http://localhost:1001

在这里插入图片描述

三、集成demo-config

1.步骤和第二步的内容基本一样,就不赘述了,相关的文件直接陈列在下面了。

项目结构图:

在这里插入图片描述

pom.xml

<?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>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>demo-config</artifactId>
    <description>Config project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.M3</spring-cloud.version>
    </properties>

    <dependencies>

        <!-- 配置中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

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

</project>

DemoConfigApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 注册中心 - Config
 *
 * @author ACGkaka
 */
@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class DemoConfigApplication {

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

}

bootstrap.yml

server:
  port: 1002

spring:
  application:
    # 用于在 eureka 面板显示
    name: demo-config
  profiles:
    # 必填
    active: native
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/repository

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:1001/eureka/

repository/demo-business-dev.yml

server:
  port: 1006

repository/demo-gateway-dev.yml

server:
  port: 1003

四、集成demo-gateway

1.步骤和第二步的内容基本一样,就不赘述了,相关的文件直接陈列在下面了。

项目结构图:

在这里插入图片描述

pom.xml

<?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>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>demo-gateway</artifactId>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.M3</spring-cloud.version>
    </properties>

    <dependencies>
        <!-- Gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- 配置中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

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

</project>

DemoGatewayApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 服务网关 - Gateway
 *
 * @author ACGkaka
 */
@EnableEurekaClient
@SpringBootApplication
public class DemoGatewayApplication {

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

}

bootstrap.yml

spring:
  application:
    name: demo-gateway
  profiles:
    active: dev
  cloud:
    config:
      # 获取不到远程配置的时候立即失败,而不是没有意义地等待
      fail-fast: true
      discovery:
        enabled: true
        service-id: demo-config
      profile: ${spring.profiles.active}
      retry:
        max-attempts: 5  # 配置重试次数,默认为5
        multiplier: 1.1  # 间隔乘数,默认1.1
        initial-interval: 1000  # 初始重试间隔时间,默认1000ms
        max-interval: 2000  # 最大间隔时间,默认2000ms
    gateway:
      discovery:
        locator:
          # 使用服务发现客户端接口DiscoveryClient,从服务注册中心获取服务注册信息,然后配置相应的路由。
          enabled: true
          # 将请求路径上的服务名配置为小写
          lower-case-service-id: true
      routes:
        # id:我们自定义的路由 ID,保持唯一
        - id: demo-business-test
          # uri:目标服务地址
          uri: lb://demo-business
          # predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
          predicates:
            - Path=/business/**

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:1001/eureka/

五、写一个业务模块 demo-business

1.步骤和第二步的内容基本一样,就不赘述了,相关的文件直接陈列在下面了。

项目结构图:(因为这是业务模块,所以保留test包)

在这里插入图片描述

pom.xml

<?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>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>demo-business</artifactId>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.M3</spring-cloud.version>
    </properties>

    <dependencies>
        <!-- Mybatis -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.1.4</version>-->
<!--        </dependency>-->

        <!-- 配置中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

DemoApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 业务
 *
 * @author ACGkaka
 */
@EnableEurekaClient
@SpringBootApplication
public class DemoApplication {

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

}

WelcomeController.java(这个是为了页面展示创建的)

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * <p> @Title WelcomeController
 * <p> @Description 首页
 *
 * @author ACGkaka
 * @date 2020/12/11 15:52
 */
@Slf4j
@Controller
public class WelcomeController {

    private static final Logger LOGGER = LoggerFactory.getLogger(WelcomeController.class);

    @RequestMapping("/business")
    @ResponseBody
    public String welcome() {
        LOGGER.info("有一个用户访问了系统。");
        return "Hello World";
    }
}

bootstrap.yml

spring:
  application:
    name: demo-business
  profiles:
    active: dev
  cloud:
    config:
      # 获取不到远程配置的时候立即失败,而不是没有意义地等待
      fail-fast: true
      discovery:
        enabled: true
        service-id: demo-config
      profile: ${spring.profiles.active}
      retry:
        max-attempts: 5  # 配置重试次数,默认为5
        multiplier: 1.1  # 间隔乘数,默认1.1
        initial-interval: 1000  # 初始重试间隔时间,默认1000ms
        max-interval: 2000  # 最大间隔时间,默认2000ms

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:1001/eureka/

访问地址:

  • http://localhost:1001 - 注册中心

  • http://localhost:1006 - 业务中心

  • http://localhost:1003 - 测试网关是否成功转发到业务中心

附:报错整理

1. 如果创建bootstrap.yml之后启动报错:

  • java.nio.charset.MalformedInputException;
  • 是因为配置文件的编码格式异常,bootstrap.yml文件是否为UTF-8格式。

在这里插入图片描述

在这里插入图片描述

2. 读取不到Config配置

  • bootstrap.yml在application.yml之前生效,应用于程序启动时的上下文阶段。搭建Spring Cloud Config 的时候应该使用bootstrap.yml。

3. Spring Cloud Gateway路由配置方式

  • 基础URI一种路由配置方式;
  • 如果请求的目标地址,是单个的URI资源路径,配置文件示例如下:
server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        -id: url-proxy-1
          uri: https://blog.csdn.net
          predicates:
            -Path=/csdn
  • 各字段含义如下:
    • id:我们自定义的路由 ID,保持唯一
    • uri:目标服务地址
    • predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
  • 上面这段配置的意思是,配置了一个 id 为 url-proxy-1的URI代理规则,路由的规则为:当访问地址http://localhost:8080/csdn/1.jsp时,会路由到上游地址https://blog.csdn.net/1.jsp。

在这里插入图片描述

显示如上内容是正常的。

4. 业务中心启动后直接退出

  • 增加如下依赖即可:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

文章地址:https://blog.csdn.net/qq_33204709/article/details/111068089

代码下载:https://download.csdn.net/download/qq_33204709/13684771

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
GitHub是一个备受开发者欢迎的代码托管平台,它提供了一个集中存储、版本控制以及协作开发的环境。GitHub官网是指GitHub的官方网站,上面提供了丰富的开源项目和仓库供开发者使用和参考。 Spring Boot是一种用于构建Java应用程序的框架,它简化了Spring开发的繁琐过程,并提供了便于配置和部署的解决方案。Spring Boot的目标是使开发者能够快速开发、轻松部署和简化配置。 Spring Cloud是基于Spring Boot开发的微服务框架,它提供了一系列的工具和组件,用于帮助开发者构建、部署和管理分布式系统中的微服务Spring Cloud提供了服务注册和发现、负载均衡、配置管理、断路器等功能,使开发者能够轻松构建弹性、可伸缩和可靠的微服务应用。 微服务全栈开发小册是指一本介绍和教学如何使用Spring Boot和Spring Cloud开发微服务的小册子。在这本小册子中,你可以学习到如何搭建和配置基于Spring Boot的开发环境,如何使用Spring Cloud构建微服务,如何进行服务注册和发现,如何实现负载均衡等等。此外,小册子还可能介绍其他相关的工具和技术,如数据库存储、API网关、消息队列等。 总而言之,GitHub官网上可以找到关于Spring Boot和Spring Cloud开发微服务的项目和仓库,而微服务全栈开发小册则是一本介绍如何使用Spring Boot和Spring Cloud进行微服务开发的教学材料。通过学习这些资料,开发者可以掌握构建和管理微服务应用程序所需的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值