Nacos搭建
一. 安装nacos
我安装的是window版,可参照该教程nacos安装教程
二.创建项目导入依赖
- 首先我们先创建一个主工程。
引入如下依赖(因为spring-clound不同版本需要的springboot版本不同,所以下面会将版本号带上)
springboot版本使用的是2.2.5.RELEASE
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 再主工程下创建一个common公共子工程,创建一个空的maven项目,引入如下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.1</version>
</dependency>
<!-- nacos依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- feign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
</dependencies>
- 主工程下创建对应的生产者消费者的springboot工程,并引入自建Common依赖
目录结构如下
三. 进行配置
对应的服务,需要注册在Nacos注册中心里。所以在application中进行配置。
在生产者和消费者中都加入该配置
#nacos配置 采用分级存储模型,将同一个机房中的实例化为一个集群
spring:
cloud:
nacos:
server-addr: xxx.xx.xx.xxx:8848
discovery:
cluster-name: SZ
application:
name: publisher
并在消费者的启动类上添加 @EnableDiscoveryClient注解
至此配置就完成了。
四.引入Feign远程调用
各个服务之间是通过Http请求来进行交互,原先使用RestTemplate进行请求,可以使用更方便的openFeign(Feign已经停止维护,可以看此篇文章)
-
引入依赖放到common包下
-
进行配置 feign底层用的HttpUrlConnect进行发送请求,可以更换为Okhttp,效率更高
feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic okhttp: enabled: true hystrix: enabled: true
-
开启Fegin 在springboot启动类上添加 @EnableFeignClients
-
发送请求。在消费者服务里建一个接口,写上需要调用的请求,并在接口上添加
@FeignClient(name = "publisher" ,path="/order")
name为请求服务的服务名,path为路径前缀@FeignClient(name = "publisher" ,path="/order") public interface OrderFegin { @RequestMapping("/test/all") Object allOrders(); @RequestMapping("/test/getOrder/{id}") Object getOrder(@PathVariable("id") String id); }
在colntroller中注入Feign接口,便可使用
@RestController @RequestMapping("/order") public class OrderController { @Autowired private OrderFegin orderFegin; @RequestMapping("/all") public Object getAllOrder(){ HashMap<String, Object> map = new HashMap<>(); map.put("order",orderFegin.allOrders()); return map; } @RequestMapping("/all/{id}") public Object getAllOrder(@PathVariable("id") String id){ HashMap<String, Object> map = new HashMap<>(); map.put("order",orderFegin.getOrder(id)); return map; } }
原理:通过指定的服务名,去注册中心查找对应的ip地址,然后去向目标发送请求
五.引入RIbbon负载均衡
-
nacos默认引入了RIbbon
默认使用ZoneAvoidanceRule(ribbon默认的轮序规则,分集群,但并不能实现根据同集群优先来实现负载均衡)
可以自定义使用哪一个规则,推荐使用NacosRule,可以同集群优先@Bean public IRule iRule(){ return new NacosRule(); }
如何配置属于哪个集群
#nacos配置 采用分级存储模型,将同一个机房中的实例化为一个集群 spring: cloud: nacos: server-addr: 172.30.61.51:8848 discovery: cluster-name: SZ #集群配置
-
RIbbon原理
通过服务名在数据中心找到多个ip,然后通过负载均衡策略(可以通过实现Irlue来实现),来制定对应的实例ip。
六.Nacos配置中心
- 服务启动时会先通过bootstrap拿到nacos地址,再去nacos去对应的配置。配置中心的配置大于本地的配置。
2. 如何通过bootstrap拿到nacos对应的配置呢,会通过服务名+profile名+后缀名组成。(nacos中没有profile名,则对该服务所有环境都生效)
spring:
application:
name: publisher # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: 172.30.61.51:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
extension-configs: #多个微服务公用的配置文件
- data-id: common.yaml
-
如何实现配置的热更新呢?
可以通过 @RefreshScope 或者 @ConfigurationProperties 来实现 -
还支持在nacos中设置优先级(1最大,0用不使用)