目录


不用选择任何依赖直接next
4.0.0 #版本管理需修改为pom打包pom #子模块qy151-gzh-springcloud-order qy151-gzh-springcloud-common qy151-gzh-springcloud-goods org.springframework.boot spring-boot-starter-parent 2.3.12.RELEASE com.gzh myspringcloud 0.0.1-SNAPSHOT #版本管理UTF-8 UTF-8 Hoxton.SR8 2.2.3.RELEASE 1.8 org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import org.springframework.boot spring-boot-maven-plugin

选择以maven项目创建即可

其他子模块可以共用公共模块的依赖不需再添加依赖了
#数据库驱动 mysql mysql-connector-java 8.0.20 org.springframework.boot spring-boot-starter-jdbc com.fasterxml.jackson.core jackson-databind 2.13.3 org.projectlombok lombok 1.18.24 com.baomidou mybatis-plus-generator 3.5.2 org.freemarker freemarker 2.3.31 #数据库连接池 com.baomidou mybatis-plus-boot-starter 3.5.2 com.alibaba druid-spring-boot-starter 1.2.11

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;
}
myspringcloud com.gzh 0.0.1-SNAPSHOT 4.0.0 qy151-gzh-springcloud-goods #引用common模块 org.springframework.boot spring-boot-starter-web com.gzh qy151-gzh-springcloud-common 0.0.1-SNAPSHOT
#服务端口号 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

IShopProductService
public interface IShopProductService extends IService{ }
ShopProductServiceImpl
@Service public class ShopProductServiceImpl extends ServiceImplimplements IShopProductService { }
ShopProductMapper
public interface ShopProductMapper extends BaseMapper{ }
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);
}
}
@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")//设置持久层扫描
public class SpringGoodApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(SpringGoodApplication.class, args);
}
}



myspringcloud com.gzh 0.0.1-SNAPSHOT 4.0.0 qy151-gzh-springcloud-order com.gzh qy151-gzh-springcloud-common 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-web
与上面一致
@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);
}
}
这样就完成了基本的微服务架构
1、添加依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
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中了

1、单独建立一个eureka模块作为启动eureka服务的服务器
2、pom.xml
org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.boot spring-boot-starter-web
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、配置客户端
添加依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
修改application.properties
#设置服务名 eureka.instance.appname=order eureka.client.service-url.defaultZone=http://localhost:7000/eureka/
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)
- .........