项目依赖关系:
web_portal依赖与pojo
service_portal依赖于dao
pojo与dao依赖于common
gateway则是网关
父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>com.mysb</groupId> <artifactId>BYue_store_mobile</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>web_portal</module> <module>dao</module> <module>common</module> <module>pojo</module> <module>service_portal</module> <module>gateway</module> </modules> <!-- 集中定义依赖版本号 --> <properties> <mysql.version>8.0.11</mysql.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> </parent> <dependencyManagement> <dependencies> <!--springcloud 2.1.1--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </dependencyManagement> </project>
搭建项目前,先把需要的version和必要的包定义在父pom中,然后在common项目中实现
- dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项,如果父类有很多依赖,这样没用的也继承来,会造成臃肿
- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖
common POM
<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"> <parent> <artifactId>BYue_store_mobile</artifactId> <groupId>com.mysb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>common</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--gateway整合nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--mysql 驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--Mybatis启动器--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> </dependencies> </project>
web_portal 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"> <parent> <artifactId>BYue_store_mobile</artifactId> <groupId>com.mysb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>web_portal</artifactId> <dependencies> <dependency> <groupId>com.mysb</groupId> <artifactId>pojo</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <exclusions> <exclusion> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> </exclusion> </exclusions> </dependency> <!--alibaba ahas 整合 sentinel--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>spring-boot-starter-ahas-sentinel-client</artifactId> <version>1.6.1</version> </dependency> </dependencies> </project>
web_portal配置文件
server: port: 9005 spring: application: name: web-portal #nacos中的服务名称 cloud: nacos: #整合gateway discovery: server-addr: ip:8849 sentinel: transport: dashboard: ip:8000 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://ip:3306/fmstore?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: 1234. mybatis: type-aliases-package: com.mysb.core.pojo mapper-locations: classpath*:com.mysb.core.dao.*/*Dao.xml ribbon: eager-load: enabled: true clients: service-portal #ribbon饥饿加载 多个服务逗号分离 feign: sentinel: enabled: true ahas: namespace: default license: ***************** project: name: web-portal
gateway 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"> <parent> <artifactId>BYue_store_mobile</artifactId> <groupId>com.mysb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>gateway</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>io.projectreactor.netty</groupId> <artifactId>reactor-netty</artifactId> <version>0.9.4.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> </dependencies> </project>
nacos集群步骤
1.编译源码, 支持mysql8数据库 [https://github.com/alibaba/nacos/releases]
2.下载后, 修改源码进行编译,把mysql数据库改为mysql8
修改pom文件<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency>
修改MysqlHealthCheckProcessor导入的包为mysql8的驱动包
修改数据库连接配置为mysql8的配置
db.url.0=jdbc:mysql://11.162.196.161:3306/diamond_devtest?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.url.1=jdbc:mysql://11.163.152.91:3306/diamond_devtest?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
3.进入到源码根目录,使用mvn进行打包
mvn -Prelease-nacos clean install -U -Dmaven.skip.test=true4.打包后, 找到nacos-1.1.4\distribution\target\nacos-server-1.1.4
- 5.在数据库当中创建nacos_config,导入nacos中sql数据
6.在 application.properties中修改端口并添加数据库信息
# 指定数据源为 Mysqlspring.datasource.platform=mysql # 数据库实例数量 db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=1234
7.把cluster.conf.example文件改为cluster.conf配置三个以上的IP:端口
8.分别进入到bin目录下,修改startup.cmd 中 set mode ="cluster"
集成Ribbon
1.不需要添加依赖
2.配置懒加载
ribbon: eager-load: enabled: true clients: goods-client #多个服务使用逗号隔开
集成Feign
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
在启动类上面加上注解:@EnableFeignClients
创建一个service文件夹,在该文件下创建一个接口
在接口加上添加@FeignClient()注解 参数就是你的微服务名字
集成sentinel
1.下载sentinel控制台服务器[https://github.com/alibaba/Sentinel/releases]
- java -Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8088 -jar sentinel-dashboard-1.7.0.jar
添加依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
4.添加配置
spring: cloud: sentinel: transport: dashboard: localhost:8080
5.整合Feign
feign: sentinel: enabled: true
使用AHAS实现规则持久化[https://ahas.console.aliyun.com/]
集成gateway
添加依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>io.projectreactor.netty</groupId> <artifactId>reactor-netty</artifactId> <version>0.9.4.RELEASE</version> </dependency> </dependencies>
配置文件
logging: pattern: console: "%d{HH:mm:ss.SSS} %clr(%5p) %clr(-){faint} %clr(%-80.80logger{79}){cyan} %clr(:) %m%n"
server:
port: 9000
spring:
application:
name: api-gateway #此实例注册到eureka服务端的name
cloud:
gateway:
routes: #当请求满足要求时,转发到指定的服务当中
- id: goods_route #唯一标识,默认是uuid
uri: http://localhost:5000/ #请求要转发的地址
order: 1 #路由优先级 越小, 优先级越高
predicates: #谓词,断言(条件判断 转发请求要满足什么条件)
- Path=/consumer-user/** #当路径中有指定内容时, 才会转发到指定uri
filters: #过滤器,拦截请求做一些额外处理
- StripPrefix=1 #去掉添加的path内容
- GateWay整合Nacos
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
在gateway配置文件中添加
spring:
cloud:
nacos:
discovery:
server-addr: localhost:80 #nacos服务的地址 不要加http
- 添加@EnableDiscoveryClient 在启动类上 -4.配置gateWay从nacos中获取服务信息
cloud:
gateway:
discovery:
locator:
enabled: true #从nacos当中获取服务信息
##service_portal 集成Mabatis - 已在common POM中添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--mysql 驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--Mybatis启动器--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
- 在启动器上添加注解 @MapperScan("com.mysb.core.dao.*") - 添加相关配置
server:
port: 9006
spring:
application:
name: service-portal
cloud:
nacos:
discovery:
server-addr: ip:8849
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ip:3306/fmstore?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 1234
mybatis:
type-aliases-package: com.mysb.core.pojo
mapper-locations: classpath:com.mysb.core.dao./*Dao.xml
- 必须依赖于dao项目 