//http接口调用配置类
@Configuration
public class RestTemplateConfig {
@Bean
//@LoadBalanced //支持注册中心使用服务名调用,并支持负载均衡
//第一次测试先不加 @LoadBalanced 注解
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@Slf4j
@RestController
public class KgcMallOrderController {
@Autowired
private RestTemplate restTemplate;
/**
* @author : zhukang
* @param : [java.lang.Integer, java.lang.Integer]
* @return : com.kgc.scda.bean.KgcMallOrder
* @description : 模拟用户下单
*/
@GetMapping("/createOrder")
public KgcMallOrder createOrder(@RequestParam Integer uid, @RequestParam Integer pid){
log.info("------ 用户编号:{},商品编号:{},模拟下单", uid, pid);
// 查询用户详情
KgcMallUser mallUser = restTemplate.getForObject("http://localhost:9602/mallUser?uid=" + uid, KgcMallUser.class);
// 查询商品详情
KgcMallProduct mallProduct = restTemplate.getForObject("http://localhost:9603/mallProduct?pid=" + pid, KgcMallProduct.class);
// 封装订单实体,入库
KgcMallOrder mallOrder = KgcMallOrder.builder()
.userId(mallUser.getId())
.userName(mallUser.getUserName())
.prodId(mallProduct.getId())
.prodName(mallProduct.getProdName())
.totalPrice(mallProduct.getProdPrice())
.build();
// 调用订单业务接口,插入订单
kgcMallOrderService.saveMallOrder(mallOrder);
log.info("------ 用户编号:{},商品编号:{},下单成功", uid, pid);
// 返回订单详情
return mallOrder;
}
}
startup.cmd -m standalone
用户名:nacos
密码:nacos
<!-- nacos 依赖 三个服务都添加 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
# 服务到nacos注册中心
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
@EnableDiscoveryClient
//将站点请求换成,服务名请求(突然记得,负载均衡就是基于服务名请求作为基础的)
KgcMallUser mallUser = restTemplate.getForObject("http://kgcmall96-user/mallUser?uid=" + uid, KgcMallUser.class);
KgcMallProduct mallProduct = restTemplate.getForObject("http://kgcmall96-prod/mallProduct?pid=" + pid, KgcMallProduct.class);
请求失败,说明使用 @LoadBalanced 注解后,RestTemplate 不能再使用站点+端口的方式请求。
<!-- openfeign 远程调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
//基本用法跟feign 差不多
//主启动类上的注解:
@EnableFeignClients
//接口上的注解: 方法调用不再 赘述
@FeignClient(value = "kgcmall96-prod")
@FeignClient(value = "kgcmall96-user")
测试方法不在赘述;
# 指定日志级别,要配置在 远程调用的客户端,配合openFeign全局日志使用
logging:
level:
com.kgc.scda.service: debug
/**
* Created On : 24/11/2022.
* <p>
* Author : huayu
* <p>
* Description: OpenFeign 全局日志配置类
*/
@Configuration //全局日志配置,如果使用@FeignClient(value = "kgcmall96-user",configuration = OpenFeignLogConfig.class)的局部日志,全局配置就不可以使用
public class OpenFeignLogConfig {
/**
* @author : huayu
* @date : 24/11/2022
* @param : []
* @return : feign.Logger.Level
* @description : openFeignLogLevel
*/
@Bean
public Logger.Level openFeignLogLevel(){
//适用于开发测试中,记录接口远程调用的全部日志
return Logger.Level.FULL;
}
}
@FeignClient(value = "kgcmall96-user",configuration = OpenFeignLogConfig.class)
# 局部日志配置方式2:在核心配置文件中,指定局部远程调用服务的日志级别,不需要全局配置类的支持,实现@FiegnClient 只用局部日志解耦
# 顶格写
feign:
client:
config:
kgcmall96-prod:
loggerLevel: FULL
# kgcmall96-user:
# loggerLevel: FULL