微服务:nacos集群与feign取代restTemplate

使用@RefreshScope注解可以实现服务的热更新。

服务处于启动状态修改,Nacos配置管理可以让服务立刻热更新。如:将yyyy-MM-dd HH:mm:ss改成yyyy年MM月dd日 HH:mm:ss

@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
    @Value("${pattern.dateformat}")
    String dateformat;
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat()));
    }
}

第二种方式实现,首先采用读取配置文件的方式完成属性注入,而非直接写死。

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    String dateformat;
}

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    PatternProperties patternProperties;
    @GetMapping("/now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }
}

Nacos的多环境配置

微服务启动时,从nacos读取多个配置文件

  1. 同名的带有环境的配置文件,如:userservice-dev.yaml
  2. 与服务同名的配置文件,如:userservice.yaml

因此,可以将多环境锁共有的配置写在第二类配置文件中。

优先级:第一类>第二类>本地编写的配置文件。


配置nacos集群

集群搭建步骤:

  1. 搭建MySQL集群并初始化数据库表

  2. 下载解压nacos

  3. 修改集群配置(节点信息)、数据库配置

  4. 分别启动多个nacos节点

  5. nginx反向代理


使用Feign代替restTemplate

  • 引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在启动类上加入自动装配注解
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {}
  • 创建接口
@FeignClient("userservice") //请求路径,为配置时输入的服务名称。
public interface UserClient {
    @GetMapping("/user/{id}")//参数列表
    User findById(@PathVariable("id") Long id);//返回值类型
}
  • 重写service层
@Autowired
UserClient userClient;

public Order queryOrderById(Long orderId) {
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    // 2.用Feign远程调用
    User user = userClient.findById(order.getUserId());
    // 3.封装到order里
    order.setUser(user);
    // 4.返回
    return order;

Feign的自定义配置,以自定义日志配置举例:

Feign的日志配置:

  1. 方式一是配置文件,feign.client.config.xxx.loggerLevel

    1. 如果xxx是default则代表全局

    2. 如果xxx是服务名称,例如userservice则代表某服务

  2. 方式二是java代码配置Logger.Level这个Bean

    1. 如果在@EnableFeignClients注解声明则代表全局

    2. 如果在@FeignClient注解中声明则代表某服务

posted @ 2022-03-02 23:09  Boerk  阅读(212)  评论(0)    收藏  举报