1.数据库环境配置
导入订单和用户表
订单表结构
用户表结构
cloud-order表中持有cloud-user表中的id字段。 
2.多模块项目创建
第一步:创建父项目cloud_project,在父项目中导入Jar包
-
PS:父项目需要删除src文件夹,因为父项目只负责管理Jar包
<dependencyManagement>通常用于管理依赖,定义管理各个依赖的版本,方便子工程直接引入依赖并且不再指定版本号。
父模块的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>
<groupId>cn.itsource</groupId>
<artifactId>cloud-shop</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- 被管理的子模块 -->
<modules>
<module>order-service</module>
<module>user-service</module>
<module>common</module>
<module>eureka-server</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>Hoxton.SR3</spring-cloud.version>
<mysql.version>5.1.47</mysql.version>
<mybatis.version>2.1.1</mybatis.version>
</properties>
<!--1.管理 SpringBoot的jar包-->
<!--SpringBoot-->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--2. 统一管理相关依赖,供子项目直接引入使用-->
<!--父工程管理这些依赖以及版本,子项目可以直接不使用版本号引入-->
<!--这里的依赖并没有真正的下下来以及导入到父工程-->
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis-->
<!--如果爆红是因为你本地仓库没有对应的版本-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--3.这里是所有子项目都可以用的jar包-->
<!--后续每个子项目都要使用的jar包就可以统一依赖在这里-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 小辣椒依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
创建新的子模块
依照下图的方法创建2个业务子模块,1个注册中心模块,1个公共的模块
Common模块
因为User模块中的User实体类需要被Order模块调用,所以直接在公共的common模块下创建一个User实体类
注册中心模块
pom.xml文件配置
注册中心的application.yml配置文件
server:#注册中心的端口号
port: 10086
eureka: # Eureka配置
instance:
hostname: localhost # Eureka服务名称
client: # Eureka客户端配置
registerWithEureka: false # 该服务不注册到到注册中心
fetchRegistry: false # 该服务不拉取注册表
serviceUrl: # 注册中心地址 http://localhost:1001/eureka/
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注册中心模块启动类
订单模块
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">
<parent>
<artifactId>cloud-shop</artifactId>
<groupId>cn.itsource</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 引入mysql连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入springboot整合的mybatis的依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- 引入springboot web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入common模块-->
<dependency>
<groupId>cn.itsource</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入注册中心客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!--springboot maven构建插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
订单模块的实体类
其中port为user模块集群的接口
订单模块的application.yml文件配置
server:#端口号
port: 8080
eureka:
client:
serviceUrl: # Eureka客户端配置,指向注册中心地址
defaultZone: http://localhost:10086/eureka/
instance:
prefer-ip-address: true # 开启使用IP地址进行注册
spring:
application: # 指定此服务的应用名称
name: order-server #服务名
datasource:
url: jdbc:mysql://47.120.6.240:3306/cloud_shop?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
mybatis:#mybatis的配置
type-aliases-package: cn.itsource.user.pojo # 数据库别名配置
configuration:
map-underscore-to-camel-case: true # 数据库表字段名和Java对象属性名之间的映射
logging:#日志级别配置
level:
cn.itsource: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
订单模块启动类
加了@Bean则表示将这个方法交给ioc容器管理,加上Ribbon的负载均衡注解@LoadBalanced赋予RestTemplate有负债均衡的能力
订单控制层
订单的业务层
使用自动注入的方式从ioc容器中取出restTemplate对象
订单模块的映射层接口
使用mybatis提供的注解去查询数据库
用户模块的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">
<parent>
<artifactId>cloud-shop</artifactId>
<groupId>cn.itsource</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!-- 组件名 -->
<artifactId>user-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- mysql的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- springboot和mybatis的整合依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- 导入springboot集成的web环境,这个依赖里面内嵌了tomcat服务器、springmvc的依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 导入common模块 -->
<dependency>
<groupId>cn.itsource</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!--springboot maven构建插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
用户模块的application.yml配置文件
server:
port: 9090
eureka:
client:
serviceUrl: # Eureka客户端配置,指向注册中心地址
defaultZone: http://localhost:10086/eureka/
instance:
prefer-ip-address: true # 开启使用IP地址进行注册
spring:
application: # 指定此服务的应用名称
name: user-server
datasource:
url: jdbc:mysql://47.120.6.240:3306/cloud_shop?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: cn.itsource.user.pojo # 数据库别名配置
configuration:
map-underscore-to-camel-case: true # 数据库表字段名和Java对象属性名之间的映射
logging:
level:
cn.itsource: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
用户模块的启动类
用户模块的控制层
用户模块的业务层
用户模块的映射层
因为需要测试端口Ribbon的随机算法,所以需要模仿用户模块的集群效果
则可以这样配置
-DServer.port=9091 -Deureka.instance.instance-id=user-server:9091
配置了用户模块的集群以后,则可以开始测试了,下图是运行的效果
最终效果
通过查看日志可以看出来Order进行了一次单表查询,然后调用用户模块的端口为9090的服务器的控制层接口获取到了user的信息
结语
如果需要测试随机负载均衡算法是否有效,那么可以重启所有服务,然后再次去请求订单模块的接口,然后请求3-6次,便可以发现port的值不一样,也就是说此时Ribbon不是默认的轮询的负载均衡算法了