微服务搭建
一、创建父工程
1.创建Springboot项目
2、选择web和lombok插件,我这里Springboot是2.6.13
3、父pom文件
1、删除父工程的src文件夹
2、在pom文件中加入
<packaging>pom</packaging>
3、引入一下pom文件,(版本已对应好)
首先,必须了解一下dependencies和dependencyManagement
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-boot-druid.version>1.1.22</spring-boot-druid.version>
<mysql.version>8.0.12</mysql.version>
<mybatis-plus.version>3.5.6</mybatis-plus.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${spring-boot-druid.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.cloud.CloudApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
4、刷新Maven
二、创建子模块
1、创建子项目
2、不选择依赖,直接创建
3、pom文件
1、在子模块pom文件中引入parent依赖
例如:
<parent>
<groupId>com.brave</groupId>
<artifactId>blogs</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
2、删除子模块pom文件中的groupId和version
3、引入一下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!--数据库部分 druid mysql mybatis-plus-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!--nacos-->
<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>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.13</version>
</plugin>
<!-- 如果需要,还可以添加其他插件,例如编译Java源代码的maven-compiler-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- 源代码编译级别 -->
<target>1.8</target> <!-- 目标代码编译级别 -->
</configuration>
</plugin>
<!-- 其他插件配置根据项目需求添加 -->
</plugins>
</build>
最后一定要刷新maven
三、nacos服务注册与发现
1、github上面下载nacos,解压
修改bin文件夹中的startup.cmd中的集群为单机模式 set MODE=“standalone”
打开startup.cmd,即开启nacos服务
2、新建子模块,并引入以下依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
注意,这个依赖是继承父pom文件的spring-cloud-alibaba-dependencies这个依赖的(如下,可以在这个里面找到nacos-discovery依赖,更好的实现了版本的统一管理)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
记得每次引入依赖之后都刷新一下
3、在启动类上面加入@EnableDiscoveryClient,使得nacos能够发现该服务(但是不知道从哪个版本开始,不加这个注解也能发现,但是还是加上)
4、添加配置文件
server:
port: 8071
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
5、启动之后,可以在nacos服务列表中发现服务已被nacos发现。
我这里是2.3.2版本的,nacos起始登录密码用户名都是nacos
四、nacos服务配置中心
1、在nacos里新建一个配置(配置管理>配置列表,点击新建)
注意:yml配置文件,必须在冒号之前加一个空格,不然格式错误无法读取到属性值
2、引入以下依赖
当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的或引导配置。因此,把 config server 信息放在 bootstrap.yml,用来加载真正需要的配置信息。简而言之,就是SpringCloud必须使用bootstrap配置。
所以,我们需要创建bootstrap.yml文件,,但是在SpringBoot 2.4.x版本之后,使用bootstrap.yaml需要导入spring-cloud-starter-bootstra依赖支持
<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-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
刷新Maven
3、新建bootstrap.yml配置文件
server:
port: 18084
spring:
application:
name: service-provider # 与nacos里面配置的文件名一致
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos-server的服务器地址
# 以下配置项必须填写
username: 'nacos'
password: 'nacos'
file-extension: yml #指定配置文件的后缀。目前只支持properties、yaml。
这里会读取到service-provider和service-provider.yml两个配置文件也就是{application.name}和
{application.name}.{cloud.nacos.config.file-extension}拼接起来的文件,但是优先service-provider.yml,如过service-provider.yml里面没有需要的配置,会再加载service-provider
4、新建Controller,看是否能够读取到配置信息
import org.springframework.beans.factory.annotation.Value;
@RestController
@RequestMapping("user")
public class UserController {
@Value("${user.id}")
private String id;
@GetMapping("id")
public String getConfigInfo() {
return this.id;
}
}
5、访问http://localhost:18084/user/id
成功调用配置属性
五、openfeign服务调用
1、导包,刷新
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、启动类添加注解@EnableFeignClients
@EnableFeignClients注解中的basePackages用于配置扫描接口包下来的类
3、创建Client包,在这个包里面创建接口类,类上引入注解@FeignClient
feign的客户端需要使用 @FeignClient 注解进行标识,这样在扫描时才知道这是一个feign客户端
@FeignClient 注解的一些主要参数和详解:
value/name: 用于指定目标服务的名称。可以使用 value 或者 name 来指定服务的名称,这个名称将会被注册到服务发现中心(例如 Eureka)并用于服务的发现。示例:@FeignClient(name = “example-service”)
url: 用于指定目标服务的 URL 地址。如果你知道目标服务的确切地址,可以使用 url 参数来指定。示例:@FeignClient(url = “http://example.com”)
path: 可选的,用于指定客户端请求的基本路径。如果目标服务的 API 有一个公共的基础路径,可以使用 path 参数来指定,这样在定义请求方法时就可以省略公共路径的部分。示例:@FeignClient(name = “example-service”, path = “/api”)
configuration: 可选的,用于指定 Feign 客户端的配置类。可以通过这个参数指定一个配置类,对 Feign 客户端进行自定义配置。示例:@FeignClient(name = “example-service”, configuration = MyFeignConfig.class)
fallback/fallbackFactory: 可选的,用于指定当 Feign 客户端请求失败时的回退处理逻辑。fallback 参数可以直接指定回退处理的类,而 fallbackFactory 则是一个工厂类,用于创建回退处理类的实例。示例:@FeignClient(name = “example-service”, fallback = MyFallback.class)
contextId: 可选的,用于指定 Feign 客户端的上下文 ID。在一个应用中可能存在多个 Feign 客户端,通过 contextId 可以为每个客户端指定一个唯一的上下文 ID。示例:@FeignClient(name = “example-service”, contextId = “myFeignClient”)
通过使用 @FeignClient 注解,你可以方便地声明一个 REST 客户端,并定义与目标服务通信的接口,Feign 将会根据这些定义自动生成相应的 HTTP 请求。
4、注入接口,获取服务