springboot搭建微服务
修改application.properties。
·
目录
1、首先建一个springboot项目(idea)


不用选择任何依赖直接next
1.1、修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
#版本管理需修改为pom打包
<packaging>pom</packaging>
#子模块
<modules>
<module>qy151-gzh-springcloud-order</module>
<module>qy151-gzh-springcloud-common</module>
<module>qy151-gzh-springcloud-goods</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.gzh</groupId>
<artifactId>myspringcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
#版本管理
<properties>
<project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<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.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、新增公共子模块

选择以maven项目创建即可

2.1、添加依赖
其他子模块可以共用公共模块的依赖不需再添加依赖了
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
#数据库驱动
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!--mybatis-plus 生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
#数据库连接池
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
2.2、建立一些公共对象

CommonResult
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
private Integer status; //200成功 201失败
private String msg; //提示信息
private Object data; //服务器返回值数据
public static CommonResult fail(){
return new CommonResult(201,"业务调用失败!!",null);
}
public static CommonResult fail(int code, String msg){
return new CommonResult(code, msg, null);
}
public static CommonResult success(){
return new CommonResult(200,"业务调用成功!!",null);
}
public static CommonResult success(Object data){
return new CommonResult(200,"业务调用成功!!",data);
}
public static CommonResult success(String msg, Object data){
return new CommonResult(200,msg,data);
}
}
ShopOrder
@Data
@Builder
@TableName("shop_order")
public class ShopOrder implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 订单id
*/
@TableId(value = "oid", type = IdType.ASSIGN_ID)
private Long oid;
/**
* 用户id
*/
private Integer uid;
/**
* 用户名
*/
private String username;
/**
* 商品id
*/
private Long pid;
/**
* 商品名称
*/
private String pname;
/**
* 商品价格
*/
private BigDecimal pprice;
/**
* 购买数量
*/
private Integer number;
}
ShopProduct
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("shop_product")
public class ShopProduct implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 商品id
*/
@TableId(value = "pid", type = IdType.AUTO)
private Long pid;
/**
* 商品名
*/
private String pname;
/**
* 商品价格
*/
private BigDecimal pprice;
/**
* 商品库存
*/
private String stock;
}
3、建立商品模块
3.1、修改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>myspringcloud</artifactId>
<groupId>com.gzh</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>qy151-gzh-springcloud-goods</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
#引用common模块
<dependency>
<groupId>com.gzh</groupId>
<artifactId>qy151-gzh-springcloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3.2、 配置数据源
#服务端口号 server.port=8082 spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 spring.datasource.druid.username= spring.datasource.druid.password= #启动mysql日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3.3、基本操作单表的类

IShopProductService
public interface IShopProductService extends IService<ShopProduct> {
}
ShopProductServiceImpl
@Service
public class ShopProductServiceImpl extends ServiceImpl<ShopProductMapper, ShopProduct> implements IShopProductService {
}
ShopProductMapper
public interface ShopProductMapper extends BaseMapper<ShopProduct> {
}
ShopProductController
@RestController
@RequestMapping("/good")
public class ShopProductController {
@Autowired
IShopProductService iShopProductService;
@GetMapping("/selectone/{gid}")
public CommonResult selectOne(@PathVariable String gid){
ShopProduct shopProduct = iShopProductService.getById(gid);
return shopProduct != null ? CommonResult.success("success", shopProduct) : CommonResult.success("没有这条数据", null);
}
}
3.4、设置主启动类
@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")//设置持久层扫描
public class SpringGoodApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(SpringGoodApplication.class, args);
}
}



4、建立订单模块
4.1、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>myspringcloud</artifactId>
<groupId>com.gzh</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>qy151-gzh-springcloud-order</artifactId>
<dependencies>
<dependency>
<groupId>com.gzh</groupId>
<artifactId>qy151-gzh-springcloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
4.2、设置数据源
与上面一致
4.3、设置启动类
@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")
public class SpringOrderApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(SpringOrderApplication.class, args);
}
@Bean//spring提供模块之间通信的类 需要手动注入
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.4、简单调用商品模块的接口进行下单
其他的mapper,service....与上面一样继承BaseMapper即可
@RestController
@RequestMapping("/order")
public class ShopOrderController {
@Autowired
RestTemplate restTemplate;
@Autowired
IShopOrderService shopOrderService;
@PostMapping("/{gid}/{count}")
@LoadBalanced
public CommonResult pay(@PathVariable String gid,@PathVariable Integer count){
CommonResult commonResult = restTemplate.getForObject("http://localhost:8081/good/selectone/"+gid, CommonResult.class);
//jackson包下的一个将object对象转为相应的java对象
ShopProduct shopProduct = new ObjectMapper().convertValue(commonResult.getData(), ShopProduct.class);
ShopOrder order = ShopOrder.builder().pname(shopProduct.getPname())
.pprice(shopProduct.getPprice())
.username("wd")
.pid(shopProduct.getPid())
.number(count)
.uid(1).build();
//存入数据库中
boolean save = shopOrderService.save(order);
return save ? CommonResult.success("添加成功", null) : CommonResult.success("添加失败", null);
}
}
这样就完成了基本的微服务架构
5、添加注册中心
5.1、nacos
1、添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、下载nacos服务器
Nacos官方文档:Nacos 快速开始
Nacos下载地址:Releases · alibaba/nacos · GitHub
编辑startup.sh,将MODE修改为standalone改为单机模式启动
然后访问http://localhost:8848/nacos/
默认帐号nacos 密码nacos

3、注册服务
编辑order模块的application.properties 新增属性
spring.cloud.nacos.server-addr=localhost:8848#nacos地址 spring.cloud.nacos.discovery.service=springcloud-order#注册服务名
可以看到已经注册到nacos中了

5.2、eureka
1、单独建立一个eureka模块作为启动eureka服务的服务器
2、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3、修该application.properties
server.port=7000 eureka.instance.hostname=localhost #是否注册自己 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false #eureka访问地址 eureka.client.service-url.defaultZone=http://localhost:7001/eureka/
4、创建主启动类
@SpringBootApplication
@EnableEurekaServer//开启eureka服务
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class, args);
}
}
5、配置客户端
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
修改application.properties
#设置服务名 eureka.instance.appname=order eureka.client.service-url.defaultZone=http://localhost:7000/eureka/
6、启动

6、负载均衡
使用其内置的ribbon做负载均衡
在主启动类上加@EnableEurekaClient注解开启
@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")
@EnableEurekaClient
public class SpringOrderApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(SpringOrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
使用负载均衡
@RestController
@RequestMapping("/order")
public class ShopOrderController {
@Autowired
RestTemplate restTemplate;
@Autowired
IShopOrderService shopOrderService;
@Autowired
DiscoveryClient discoveryClient;
@PostMapping("/{gid}/{count}")
public CommonResult pay(@PathVariable String gid,@PathVariable Integer count){
//会查询所有这个名字下服务 并进行轮询访问
CommonResult commonResult = restTemplate.getForObject("http://设置服务名/good/selectone/"+gid, CommonResult.class);
ShopProduct shopProduct = new ObjectMapper().convertValue(commonResult.getData(), ShopProduct.class);
ShopOrder order = ShopOrder.builder().pname(shopProduct.getPname())
.pprice(shopProduct.getPprice())
.username("wd")
.pid(shopProduct.getPid())
.number(count)
.uid(1).build();
boolean save = shopOrderService.save(order);
return save ? CommonResult.success("添加成功", null) : CommonResult.success("添加失败", null);
}
}
自定义策略
#修改application.properties
springcloud-order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
- 随机 (RandomRule)
- 轮询 (RoundRobinRule)
- 加权(WeightedResponseTimeRule)
- .........
更多推荐



所有评论(0)