1.为什么会有注册中心?
在微服务拆分的理念中,我们必须遵循每个服务尽量的完全独立,类独立,接口独立,方法独立,不依赖别的服务,这样就最大程度的耦合性降低。但随之而来的却是一系列问题,像我们一个接口可能就会调用别的服务的接口,这样就会逻辑上的跨越主机。但为了遵循服务独立的理念,我们在这种情况就可以选择远程调用,对别的服务发起网络请求,这样看似是解决了问题,但如果这个接口的并发量非常大,我们可以多搭建几个同样的服务供调用者来调用,但这时,发起网络请求就不知道请求谁了,比如某一个服务不能正常运行了,调用者不能实时监控这些服务,于是服务治理的理念就出来了。
服务治理有三个角色:服务提供者,服务调用者,注册中心。当每个微服务运行起来的时候,就会去注册中心注册自己的信息,比如端口号,ip地址等等。当调用者需要调用的时候,就去注册中心去订阅服务,然后通过负载均衡的算法,选择某一个服务进行调用。并且服务供给者会和注册中心形成一个心跳,给注册中心汇报自己的健康情况,如果某个供给者没有汇报,那注册中心就会剔除这个供给者,并且给之前订阅过这个服务的调用者推送变更消息。
2.注册中心nacos
服务注册
要使用nacos,首先得让docker把nacos跑起来
然后引入依赖,配置naocs地址
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
application:
name:xxx.service
cloud:
nacos:
discovery:
server-addr: 192.168.203.130:8848
然后运行这个服务,这个服务就会自动的去注册自己的信息到nacos,去nacos控制台就可以看见注册的服务了
服务发现
1.引入nacos的依赖和配置nacos地址
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
application:
name:xxx.service
cloud:
nacos:
discovery:
server-addr: 192.168.203.130:8848
2.用DiscoverClient来调用获取服务实例
private final DiscoveryClient discoveryClient;
private void handleCartItems(List<CartVO> vos) {
// 1.根据服务名称,拉取服务的实例列表
List<ServiceInstance> instances = discoveryClient.getInstance("xxx.service");
// 2.负载均衡,挑选一个实例
ServiceInstance instance = instance.get(RandomUtil.randomInt(instances.size()));
// 3.获取实例的ip和端口
URI uri = instance.getUri(); //uri = http://your_ip:your_port
}
3.openfeign怎么用
在spring7之前,负载均衡都用的是Ribbon,现在新版用的是openfeign。
3.1先引入依赖
<!--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>
3.2在启动类上加入@EnableFeignClients注解
3.3编写OpenFeign客户端
@FeignClient(value = "item-service")
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> getItemByIds(@RequestParam("ids") List<Long> ids);
}
3.4调用
List<ItemDTO> items = itemClient.getItemByIds(itemIds);
3.5 openfeign底层采用的是HttpURLConnection,效率低下,我们可以采用连接池的方式
引入依赖
<!--OK http 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
yaml 开启连接池
feign:
okhttp:
enabled: true # 开启OKHttp功能
3.6 日志
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
- ONONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据
由于Feiqn默认的日志级别就是NONE,所以默认我们看不到请求日志
要自定义日志级别需要声明一个类型为Logger.Level的Bean,在其中日志级别为
public class DefaultFeignConfig {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.FULL;
}
}
但此时这个Bean并未生效,要想配置某个FeignClient的日志,可以在@FeignClient注解中声明:
@FeignClient(vlaue = "item-service", configuration = DefaultFeignConfig.class)
如果想要全局配置,让所有FeignClient都按照这个日志配置,则需要在@EnableFeignConfig注解中声明:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
标签:服务,openfeign,spring,nacos,---,注册,日志,cloud
From: https://blog.csdn.net/iwjijksw/article/details/142298457