1.创建服务
1.1 创建父服务
1.2创建子服务
1.3 创建孙子模块
我当时创建服务的想法是一个大的工程,然后有多个子服务。所有我在第二步:1.2的时候,创建测module之后删除了src文件,然后在modul下再重复1.2的操作。不过需要注意的是,孙子辈的module创建过程需要改一下parent ,最后呈现的效果如下:
1.4 结构说明
* 其中四个红框圈起来的分别都是一个子服务,可以独自启动。
* 当时工作之前见过的是一个叫做分层设计的开发结构。就是单独名字是服务层。也就是consumer,accout 负责和前端对接的接口层,不负责操作数据。只管逻辑
* 带db的是数据层,是用来做数据层。只负责和数据打交道,不负责逻辑。这样做的具体好处暂时不太了解,之后懂了之后可以再更新
2. 配置文件
2.1 父pom
我是比较懒,没有做管理,直接引入了。而通常都是在父pom中做管理,
<dependencyManagement></dependencyManagement> 然后子服务用到直接引用就行了。 这个地方只是做管理而不是引用
<?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>
<!-- 顶层父模块是springboot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zs</groupId>
<artifactId>wanxinp2p</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>wanxinp2p-consumer</module>
<module>wanxinp2p-account</module>
</modules>
<!--版本设置-->
<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>2021.0.1</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
<spring-boot.version>2.6.4</spring-boot.version>
</properties>
<!-- 引入包管理 -->
<dependencies>
<!--springboot-->
<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>
<!--这个引入就是当前服务可以直接自己启动,我是直接写到顶层了,实际可以在各自用的地方引入。如API其实是不用这个-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springcloud-->
<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.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--这个是nacos做服务管理的引入-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
</dependencies>
</project>
wanxinp2p-consumer这个父pom里面写的是openfeign和okhttp
<dependencies>
<!--因为api模块也需要,注解@FeignClient-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.4</version>
</dependency>
<!--这个是修改访问方式为okhttp,据说是效率更好-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>11.9.1</version>
</dependency>
</dependencies>
2.2 子pom
消费者:这个pom是consumer下的pom,也就是消费服务或者业务层的包引入
<dependencies>
<dependency>
<groupId>com.zs</groupId>
<artifactId>consumer-db-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<!--这个地方一定要引用,因为springcloud 在版本2020之后就把rabbon 移除了,不加这个会 报服务找不到这样的问题-->
<!-- Spring Cloud loadbalancer 负载均衡-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.8</version>
</dependency>
</dependencies>
生产者: 这个是consumer-db服务的pom,
<dependencies>
<!--数据库链接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!--mybatis-spring-boot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.github.pagehelper</groupId>-->
<!-- <artifactId>pagehelper-spring-boot-starter</artifactId>-->
<!-- <version>1.3.0</version>-->
<!-- </dependency>-->
<!--mybaits-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!--这个地方之所以也引入这个,是因为之后我们的实体类会再api中写-->
<dependency>
<groupId>com.zs</groupId>
<artifactId>consumer-db-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.3 application.yml
consumer:
server:
port: 30031
spring:
application:
name: consumer
cloud:
nacos:
discovery:
# 这个地方是你nacos的地址
server-addr: localhost:8848
# 这个是nacos的命名空间,需要先在nacos中配置。也可以自己写
namespace: c0753621-75f3-420c-bbf8-19c7493ed955
# 这个地方通常是多人协作开发用的。你的服务和别人服务都在启动。你又想让你的业务层调用你的数据层。那么loadbalance会根据这个地方来调用。
# 通常会有一个loadbalance的配置,我暂时没有想起来,之后想到再补充
cluster-name: wangchen
#这个就是开启okhttp
feign:
httpclient:
connection-timeout: 2000
max-connections: 200
okhttp:
enabled: true
consumer-db:
server:
port: 20031
spring:
application:
# 这个地方需要注意一下,这个就是我们注册到nacos的名字,我们feign就是根据这个来访问的
name: consumer-db
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: c0753621-75f3-420c-bbf8-19c7493ed955
cluster-name: wangchen
datasource:
type: com.zaxxer.hikari.HikariDataSource
username: root
password: 123456
url: jdbc:mysql://localhost:3306/wx_consumer?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
minimum-idle: 10
idle-timeout: 600000
maximum-pool-size: 20
auto-commit: true
max-lifetime: 1800000
connection-timeout: 30000
feign:
httpclient:
connection-timeout: 2000
max-connections: 200
okhttp:
enabled: true
3.代码
** consumer
的启动类,这里需要注意的就是开启feign.如果你的springboot报名扫描,如果两个服务包名不一样就容易出现扫不到,那么就需要加上basepackages
@SpringBootApplication
@EnableFeignClients(basePackages = "com.zs.consumer.db.client")
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
** consumer-db
的启动类不需要做其他处理
这是一个服务提供者的接口服务,主要是为了展示api中的接口怎么写
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
Logger logger = LoggerFactory.getLogger(ConsumerController.class);
@GetMapping("/getConsumerById")
public void getUserById(Integer id){
logger.info("=======Integer id====== {}", id);
}
}
** consumer-db-api
这里就是只写了一个接口,注意name的值是我们刚才在db的yml文件中写的那个application.name. 服务消费者访问这个接口的时候,就会到db服务找
@FeignClient(name = "consumer-db")
public interface ConsumerClient {
@GetMapping("/consumer/getConsumerById")
void getUserById(@RequestParam Integer id);
}