版本:springcloud分为springcloud netflix(停更)和springcloud alibaba两个版本
关系:springBoot可以单独使用,springCloud需要和springBoot搭配使用
搭建微服务架构
注册中心(常用的有zookeeper、eureka、consul、nacos四种,这里使用nacos)
解压后打开bin下的starterup.cmd修改配置文件为单机模式 --set MODE="standalone"
双击starterup.cmd启动即可,启动后浏览器访问localhost:8848进入页面,账号密码默认为nacos
父工程(创建一个springBoot工程修改pom文件并把src文件删除,带有注释的版本号进官网查看)
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <!--springBoot版本为2.3.12.RELEASE-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.bzeh</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!--父工程打包方式都为pom-->
<name>demo</name>
<description>demo</description>
<modules>
<module>vo</module>
<module>productVo</module>
<module>order</module>
</modules>
<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.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version> <!--springCloud版本-->
<spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version> <!--阿里巴巴版本-->
</properties>
<dependencyManagement> <!--只负责jar包管理不负责jar下载-->
<dependencies>
<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>
</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.bzeh.demo.DemoApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
公共模块(实体类,vo,工具类等都可以放入该模块中)
在父工程下创建一个普通的maven工程并引入依赖
<dependencies> <dependency> <!--lombok依赖--> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <!-- 引入MyBatis Plus的Spring Boot启动器,用于简化MyBatis的使用 --> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> <dependency> <!-- 引入Spring Boot的Web启动器,用于简化Spring Web应用的配置 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
创建实体类
@Data //lombok快速注解 @NoArgsConstructor @AllArgsConstructor @TableName("tbl_product") //定义数据库表名 public class Product { @TableId(type= IdType.AUTO) //定义主键且递增 private Integer pid; private String pname; private BigDecimal price; private Integer stock; }
配置类
@Configuration public class RestConfig { //http协议调用,适用于spring工程 @Bean //把方法的返回对象交于spring容器管理 @LoadBalanced //启用RestTemplate的远程调用使用ribbon作为负载均衡组件 public RestTemplate restTemplate(){ return new RestTemplate(); } }
创建微服务模块(微服务可以创建多个)
引入依赖
<dependencies> <dependency> <!--引入父工程依赖--> <groupId>com.bzeh</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <!-- 引入MyBatis Plus的Spring Boot启动器,用于简化MyBatis的使用 --> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> <dependency> <!-- 引入Nacos服务发现的Spring Boot启动器,用于服务注册和发现 --> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <!-- 引入MySQL数据库连接器,用于与MySQL数据库交互 --> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <!-- 引入Spring Boot的Web启动器,用于简化Spring Web应用的配置 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <!--引入openfeign--> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
application.properties配置文件
#服务器配置# #指定服务器端口 server.port=8080 #设置服务器名称 spring.application.name=project #数据库配置# #数据库用户名 spring.datasource.username=root #数据库密码 spring.datasource.password=root #设置数据库连接url spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC #设置数据库驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #mybatisPlus配置# #mybatis日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #指定mybatis的mapper文件位置 mybatis-plus.mapper-locations=classpath*:mapper/*.xml #nacos配置# #设置nacos服务器地址,将该微服务地址交给nacos管理 spring.cloud.nacos.discovery.server-addr=localhost:8848
主启动类
@SpringBootApplication //定义springBoot应用 @MapperScan("com.job.mapper") //扫描mapper映射文件接口 @EnableFignClients //开启openfeign的注解驱动 public class ProductApp { public static void main(String[] args){ SpringApplication.run(ProductApp.class,args); //启动springBoot应用 } }
mapper映射文件接口
public interface ProductMapper extends BaseMapper<Product> { }
service和serviceImp业务层
public interface ProductService { Product selectById(Integer pid); //一个简单的查找功能 } @Service //service接口的实现类 public class productServiceImp implements ProductService { @Autowired //自动注入mapper private ProductMapper productMapper; @Override public Product selectById(Integer pid) { //实现接口的查询方法 return productMapper.selectById(pid); } }
如果使用openfeign进行远程调用的话需要创建一个openfieng接口
@FeignClient(value = "nacos服务器中的服务名") public interface ProductFeign { @GetMapping("/product/getById/{pid}") //这里的请求方式以及参数类型必须和目标方法本身一致。 public Product getById(@PathVariable Integer pid); }
ribon提供的负载均衡策略(ribbon内置多种负载均衡策略,内部负载均衡的顶级接口为com.netflix.loadbalancer.IRule)
ribbo使用
选择最小并发请求server:BestAvailableRule
随机选择server:RandomRule
轮询方式轮询选择:RoundRobinRule
过滤失效的server和高并发的server:AvailabilityFilteringRule
根据时间分配weight:时间越长weight越小,选中的概率越低
对选定的负载均衡策略机上重试机制:RetryRule
符合判断server所在区域性能和server可用性:ZoneAvoidanceRule
第一种:局部使用(修改Application.properties配置--nacos服务器添加的服务器名.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule)
第二种:全局使用(RestConfig配置类中添加配置)@Bean public IRule myRule(){ ruturn new RandomRule(); }