当微服务部署的实例越来越多时,逐个修改微服务配置就会效率低下,而且很容易出错,所以我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
而Naocs除了可以做注册中心,同样也可以做配置管理来使用:
如何在nacos中管理配置呢?
然后在弹出的表单中,填写配置信息:
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动:
因此Spring引入了一种新的配置文件:bootstrap.yml文件,会在application.yml之前被读取,流程如下:?
1. 引入nacos-config依赖:引入Nacos的配置管理依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 在resource目录中添加一个bootstrap.yml文件,这个文件是引导文件,它的优先级高于? ? ? ? ? ? ? ? application.yml
配的就是Data ID:?
spring:
application:
name: userservice # 配置服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # 配置Nacos地址
config:
file-extension: yaml # 文件后缀名
3. 读取nacos配置
在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
?
?
要实现配置热更新,可以使用两种方式:需要通过下面两种配置实现
方式一:在@Value注入的变量所在类上添加注解@RefreshScope
方式二:使用@ConfigurationProperties注解代替@Value注解 ?
当nacos、服务本地同时出现相同属性时,多种配置的优先级有高低之分:
其作用就是帮助我们优雅的实现HTTP请求的发送~!
OpenFeign是一个声明式的HTTP客户端,是Spring Cloud在Eureka公司开源的Feign基础上改造而来,官方地址:https://github.com/OpenFeign/feign?
其作用就是基于SpringMVC的常见注解,帮我们优雅的实现http请求的发送~!
OpenFeign已经被Spring Cloud自动装配,实现起来非常简答:
<!--OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
旧版本中用的才是Ribbon,新版本中用的都是loadbalancer。?
2. 在启动类通过添加@EnableFeignClients注解,启用OpenFeign功能
?
在cart-service
中,定义一个新的接口,编写Feign客户端:
其中代码如下:
package com.hmall.cart.client;
import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient("item-service")
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
这里只需要声明接口,无需实现方法。接口中的几个关键信息:
Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:
HttpURLConnection:默认实现,不支持连接池 => 每一次都需要重新创建连接,因此效率极低
Apache HttpClient :支持连接池
OKHttp:支持连接池
引入依赖:?
<!--OK http 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
开启连接池:
在application.yml
配置文件中开启Feign的连接池功能feign:
okhttp:
enabled: true # 开启OKHttp功能
重启服务,连接池就生效了。?
所谓最近实践,就是使用过程中总结的经验,最好的一种使用方式。 ??
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
NONE:不记录任何日志信息,这是默认值。
BASIC(推荐):仅记录请求的方法,URL以及响应状态码和执行时间
HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。
要自定义日志级别需要声明一个类型为Logger.Level的Bean,在其中定义日志级别:
也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象
public class DefaultFeignConfiguration {
? ?@Bean
? ?public Logger.Level feignLogLevel(){
? ? ? ?return Logger.Level.BASIC; // 日志级别为BASIC
? }
}
如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
如果是局部生效,则把它放到对应的@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
由于每个微服务都有不同的地址或端口,入口不同,在与前端做联调时会发现:
单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息,而微服务拆分后,每个微服务都独立部署,这就存在一些问题:
可以通过API网关技术来解决上述问题。
网关的核心功能特性?
网关就是网络的关口,是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,负责请求的路由 => 服务路由(告诉你在几楼几号这叫做路由)、转发(你找不着带你过去这叫做转发)以及用户登录时的身份校验(身份认证和权限校验,做过滤拦截)(检查你户口本)。
数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。
网关是所有微服务的统一入口?
?
?更通俗的来讲,网关就像是以前园区传达室的大爷。
外面的人要想进入园区,必须经过大爷的认可,如果你是不怀好意的人,肯定被直接拦截。
外面的人要传话或送信,要找大爷。大爷帮你带给目标人。
现在,服务网关就起到同样的作用,前端请求不能直接访问微服务,而是要请求网关:
如果微服务有做集群,网关还要进行负载均衡:?
?