Nacos注册中心和Feign远程调用
下载解压打开Nacos跳转到bin目录输入 startup.cmd -m standalone 启动
父工程导入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
客户端导入依赖
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
在yaml文件中设置Nacos地址
spring
cloud: #nacos服务地址
nacos:
server-addr: localhost:8848 #nacos服务地址
重启服务 登入Nacos地址 点击服务列表 即可查看是否被注册进Nacos
我们还可以针对多个服务设置多个集群,避免跨集群调用,如果本地集群中的所有服务挂了以后才会调用其他集群的服务。
spring
cloud: #nacos服务地址
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: HZ 集群名称 上海
负载均衡和Euraka中设置的一样
可以在启动类重写IRule或者在yml中设置新的规则
@Bean
public IRule randomRule(){ return new RandomRule(); }
userservice: #要配置的服务器的名称采取负载均衡的方式的总类
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #修改userservice负载均衡的规则
权重
Nacos中找到 服务列表 点击 详情 点击编辑即可对服务进行权重设置
0到1之间 数值越高访问的比例越大,数值为0时不访问。
Nacos 通过 namespace 来实现环境隔离功能。
我们常用的有Test测试环境,dev开发环境等多种环境。
我们可以在Nacos的空间中创建namespace,来进行环境区分。
命名空间---新建命名空间 即可创建一个新的namespace 伴随着也会生成一个随机的id 将id书写在yml文件中即可对服务进行隔离。
设置ephemeral 为trul 或者 false 即可设置该服务是否为临时实例或非临时实例
临时实例,如果服务挂了就会被Nacos删除 非临时实例,如果服务挂了不会删除而是等待服务重启
string
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: HZ
namespace: aaf83a77-0a18-4d4a-b36f-6e019778bda5 #dev 命名空间环境
ephemeral: false #是否是临时的
Nacos的配置管理
在 Nacos 控制面板中添加配置文件 以服务名称+环境+yaml命名
多服务的配置也可交给Nacos进行管理,使用Nacos以后项目启动会先去Nacos里面加载配置文件,但是如果我们还把Nacos的地址放在application.yml中那就失去意义了,因此我们可以创建一个优先级最高的bootstrap.yml文件中。
首先导入Nacos管理依赖
<!--nacos的配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.yml文件
spring:
application:
name: userservice #服务名称
profiles:
active: dev #环境
cloud:
nacos:
server-addr: localhost:8848 #Nacos地址
config:
file-extension: yaml #后缀名
通过bootstrap.yml文件中的服务名称+环境+后缀名 去加载Nacos 控制面板中的配置文件
配置文件分为三种
第一种:userservice-dev.yaml 第二种:userservice.yaml 第三种:本地的配置文件
第一种可能会因为环境不一样不被加载,但是第二种是无论如何都会被加载的。
优先级
三种文件出现了同一个属性那么就会产生优先级
第一种 > 第二种 > 第三种
服务名称+当前环境+yaml > 服务名称+.yaml > 本地配置
Feign远程调用
需要使用Feign的服务中引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类加入注解开启Feign远程调用
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class) // 开启Feign远程调用
在Service中创建一个用于接口调用的接口类
import cn.itcast.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
这样其他需要调用userservice/user/id 接口中的数据的服务只要注入UserClient 接口并Get当中的方法就能获取接口中的数据并实现远程调用。
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用restTemplate发送http请求;
User user = userClient.findById(order.getUserId());
System.out.println(user);
//3.把数据封装到order中
order.setUser(user);
// 4.返回
return order;
}
Feign的优化
日志尽量用basic/none,none为默认日志
第二种就是更改底层框架,使用连接池更改默认的URLConnection的请求方式
- URLConnection:默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
导入依赖 Apache HttpClient
<!--httpClient的依赖 优化Feign -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
更改yml配置文件
#Feign日志连接池:
feign:
httpclient:
enabled: true
max-connections: 200 #最大连接数
max-connections-per-route: 50 #单个路劲连接数
打成jar包
如果服务多了这样也很麻烦于是我们可以把包括user实体类和接口数据以及配置文件打成jar包,让需要用的服务,直接引入jar包,不需要创建实体类以及接口文件。
在新建文件服务导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
其他需要用到这个jar包的直接导入依赖即可
<dependency>
<groupId>com.lz.feign</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
然后在启动类的@EnableFeignClients注解中指定导入的jar包
原先
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
@EnableFeignClients(clients = UserClient.class, defaultConfiguration = DefaultFeignConfiguration.class)
clients 后面是集合类型,可以同时引入多个接口