0.github地址
1.项目目录结构
- 各模块基本结构
|--spring-cloud-nacos目录结构
| |--raven-common
| | |--utils
| | |--constant
| |--raven-nacos
| |--raven-service
| | |--raven-driver-service
| | |--raven-order-service
| |--raven-service-api
| | |--raven-driver-service-api
| | |--raven-order-service-api
2.各模块责任及maven依赖、yml、重要注解
2.0.spring-cloud-nacos
2.0.1.pom.xml
<!--继承spring-boot-starter-parent,确定springboot版本号-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!--项目描述信息-->
<modelVersion>4.0.0</modelVersion>
<groupId>com.raven</groupId>
<artifactId>spring-cloud-nacos</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version
<modules>
<module>raven-common</module>
<module>raven-nacos</module>
<module>raven-service</module>
<module>raven-service-api</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--打包的时候跳过测试-->
<skipTests>true</skipTests>
</properties>
<!--声明项目springcloud依赖版本信息-->
<dependencyManagement>
<dependencies>
<!-- 声明依赖 springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明依赖 springCloudAlibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.1.raven-common
2.1.1.存放整个项目公共文件,如utils工具类、contant常量等等
2.1.2.管理整个项目公共依赖,如mysql数据库、redis、mq等等
2.1.3.pom.xml
<dependencies>
<!--数据库相关依赖 start -->
<!--通用mapper起步依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<!--mybatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- z-orm -->
<dependency>
<groupId>com.zhouyutong</groupId>
<artifactId>z-orm-jdbc</artifactId>
<version>4.1-SNAPSHOT</version>
</dependency>
<!-- alibaba druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!--数据库相关依赖 end -->
<!-- Spring Boot Starts -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2.raven-nacos
2.2.1.nacos的配置中心服务,可以用来获取在nacos中的配置信息
2.2.2.pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos配置中心依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
</dependencies>
2.2.3.bootstrap.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 控制台添加配置:
# Data ID:example.properties
# Group:DEFAULT_GROUP
# 配置内容:useLocalCache=true
spring.application.name=config-server
# 指定配置的后缀,支持 properties、yaml、yml,默认为 properties
spring.cloud.nacos.config.file-extension=properties
#spring.cloud.nacos.config.file-extension=yaml
2.2.4.ConfigController
@RestController
@RequestMapping("/config")
// 动态的刷新config数据
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
/**
* http://localhost:8080/config/get
*/
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
2.3.raven-service
2.3.1.管理整个项目业务相关微服务服务文件,如order服务,driver服务
2.3.2.各业务服务可以基于nacos进行注册发现,通过feign远程调用
2.3.3.各业务服务pom.xml
<dependencies>
<!--注册发现到nacos的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--driver微服务远程调用接口、实体类-->
<dependency>
<groupId>com.raven</groupId>
<artifactId>raven-driver-service-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
2.3.4.各业务服务application.yml
server:
port: 38943
spring:
application:
name: consumer
profiles:
active: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false
username: dipao
password: dipao123
# nacos注册中心地址信息
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
feign:
hystrix:
enabled: true
mybatis:
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.edaijia.edipao.driver.entity
2.3.4.各业务服务启动类Application
@SpringBootApplication
//扫描Mapper
@MapperScan("com.raven.consumer.mapper")
/**
* 项目是多模块,包名不同,所以扫描不到 需要加basePackages
*/
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.raven.driver.feign"})
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2.3.5.各业务服务feign远程注入
@RestController()
@RequestMapping("/consumer")
public class ConsumerController
@Autowired
private DriverFeign driverFeign;
}
2.4.raven-service-api
2.4.1.管理整个项目业务相关各微服务远程调用接口、实体类,如orderFeign、orderEntity、orderAddReq等等
2.4.2.各远程调用接口、实体类微服务pom.xml
<!--通用的common-->
<dependencies>
<dependency>
<groupId>com.raven</groupId>
<artifactId>raven-common</artifactId>
<version>${project.version}</version>
</dependency>
<!--远程服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2.4.3.各远程调用接口feign
/**
* @PackageName: com.raven.driver.feign
* @ClassName: DriverFeign
* @Blame: raven
* @Date: 2021-07-07 17:19
* @Description:
* FeignClient注解: 该接口对外提供远程调用,远程调用服务名称为driver
* 调用地址为类上的RequestMapping + 方法上的GetMapping
*/
@FeignClient("driver")
@RequestMapping("/driver")
public interface DriverFeign {
@GetMapping("/get/{id}")
public DriverEntity getOne(@PathVariable(value = "id") int id);
}
3.需要注意可能会踩坑的地方:
3.1.nacos config配置文件bootstrap.properties
指定配置的后缀,支持 properties、yaml、yml,默认为 properties
spring.cloud.nacos.config.file-extension=properties
- 配置中心存储配置的格式必须和bootstrap.properties 中配置的一致,否则会出现配置中心更新数据成功,但是远程接口调用配置,数据并没有动态更新
3.2.@EnableFeignClients注解 basePackages
- EnableFeignClients注解: 允许服务远程调用其他服务(开启服务远程调用功能)
项目是多模块时,包名不同,所以扫描不到,需要在注解中指定 basePackages
---------------------------------------------- 2021-07-15更新----------------------------------------------
@EnableFeignClients(basePackages = {“com.raven.driver.feign”})
必须指定其他服务名称,否则引入自己服务feign会报错
错误如下:
IllegalStateException: Ambiguous mapping. Cannot map 'xxx.XxxClient' method
3.3.spring-cloud-starter-alibaba-nacos-config 依赖 版本
- 根据官网文档配置相应的nacos-config版本依赖
spring-cloud版本说明,一直无法成功引入,最后发现上述文档仅仅只是springcloud-springboot-springCloudAlibaba的版本指引,并非nacos-config,下面是nacos-config的版本依赖。
<!--版本号只有0.2.X-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
------------------------------------2021-07-12更新-----------------------------
也可使用com.alibaba.cloud下的nacos config 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
3.4.springcloud maven依赖无法导入
3.5.springcloud 项目启动后,无法找到其他XXX服务
排查后发现,服务提供方和服务消费方采用了不同的分组配置,导致服务注册成功,但找不到
# 消费者
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 08c3e74b-5b7c-4924-a593-e4cf2712317f # 使用的 Nacos 的命名空间,默认为 null
group: raven-consumer-service
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 08c3e74b-5b7c-4924-a593-e4cf2712317f # 使用的 Nacos 的命名空间,默认为 null
group: raven-producer-service
3.6 Method has too many Body parameters的处理办法
feign书写时不通过@PathVariable拼接参数时,需要通过@RequestParam + @RequestBody拼接参数,RequestBody有且只能有一个 (可以省略不写)
// 正确书写方式如下:
// 1.
@ApiOperation(value = "根据条件构造器修改司机信息")
@RequestMapping(path = "/updateByCriteria")
public void updateByCriteria(BaseCriteriaDTO criteriaDTO);
// 2.
@ApiOperation(value = "根据司机手机号获取司机信息(指定查询字段)")
@RequestMapping(path = "/getByPhone/includeFields")
public DriverInfoEntity getByPhone(@RequestParam(value = "phone") String phone, List<String> includeFields);
// 错误书写方式1:
@ApiOperation(value = "根据条件构造器修改司机信息")
@RequestMapping(path = "/updateByCriteria")
public void updateByCriteria(Criteria criteria, Update update);
3.6 spring cloud 多次启动报错,找不到指定配置?
nacos会根据 namespace->group->dataId 找到唯一的配置文件,并进行加载。
当没有配置spring-cloud–nacos-config-name时,dataId = spring.application.name + file-extension(默认为properties)
当配置name后 dataId = name + file-extension = nacosConfig.yaml
如果在指定的namespace - group - dataId 中没有找到对应的配置 springboot就会报错
3.7Nacos配置中心,项目拉取配置报错
错误信息:
NACOS SocketTimeoutException httpGet] currentServerAddr:http://localhost:8848, err : connect timed out
原因:
bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等;
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载
处理方案:
application.yml 更改为bootstrap.yml即可