上一篇文章讲的是springcloud注册eureka,本篇讲springcloud注册nacos服务
首先下载nacos最新版本服务器地址:github下载地址
解压进入到bin目录,编辑startup.cmd文件,找到Set Mode=“cluster”,改为Set Mode=“standalone”。说明:把nacos启动模式从集群改为单机。
进入conf目录,打开application.properties
修改nacos数据库连接
默认使用mysql数据库,建立数据库名为nacos_config
在mysql中执行conf目录下nacos-mysql.sql文件,打开nacos_config数据库的users表
这是nacos用户表,登录使用的用户名和密码:nacos/nacos
执行startup.cmd启动nacos服务,出现界面:
表示nacos成功启动,浏览器进入http://localhost:8848/nacos登录界面
输入用户名密码进入首页
创建springcloud项目,引入springboot-starter-parent
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.5.14version>
parent>
springcloud依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>2020.0.6version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
Nacos和Ribbon的相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
<version>2.1.2.RELEASEversion>
dependency>
dependencies>
application.properties文件配置
server.port=8081
spring.application.name=nacosSystem
##springcloud注册nacos服务地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
首先,需要启用 nacos-discovery,它是用于nacos服务的发现,我们要注册nacos服务就要发现它。
其次,使用Ribbon实现负责均衡,可使用两种方法实现:
1.同时使用loadBalancerClient和RestTemplate
@SpringBootApplication
@EnableDiscoveryClient
@Configuration
public class LoadApplication {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping("/test")
public String test(){
//使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose("nacosSystem");
String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/hello"
return restTemplate.getForObject(url,String.class);
}
public static void main(String[] args) {
SpringApplication.run(LoadApplication.class, args);
}
}
2.Ribbon使用的RestTemplate 类上加@LoadBalanced注解表示启动负载均衡,这时可去掉注解@EnableDiscoveryClient,同样能发现nacos服务
@SpringBootApplication
@Configuration
public class LoadApplication {
@Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping("/test")
public String test(){
return restTemplate.getForObject("http://nacosSystem/hello",String.class);
}
public static void main(String[] args) {
SpringApplication.run(LoadApplication.class, args);
}
}
这时URL地址无需加入ip地址,直接使用:应用名称+路径
注1:为什么加上 @LoadBalanced就不能访问ip加端口呢?
主要因为其使用ribbon组件,当我们应用依赖了eureka-client的时候,eureka-client依赖了ribbon,虽然看是ribbon没有存在感,但是ribbon默默的发挥着自己的负载均衡能力。在加了注解 @LoadBalanced 之后,我们的restTemplate 会走这个类RibbonLoadBalancerClient,serverid必须是我们访问的服务名称 ,当我们直接输入ip的时候获取的server是null,就会抛出异常。而这个服务名称是需要我们在Eureka中配置的,如果没有配置直接访问则会报错。
注2:为什么不加IP和端口都能通过RestTemplate访问呢?
添加了ribbon依赖后,会在项目启动的时候自动往RestTemplate中添加LoadBalancerInterceptor拦截器,用户根据RestTemplate发起请求时,会将请求转发到LoadBalancerInterceptor去执行,该拦截器会根据指定的负载均衡方式获取该次请求对应的应用服务端IP、port。根据获取到的IP、port重新封装请求,发送HTTP请求,返回具体响应
org.springframework.web.client.RestTemplate因为使用得比较多,其详细使用方法可参考博客:RestTemplate API
最后,启动两个springcloud项目,nacos注册可在列表中查看到
至此,springcloud的nacos注册,和Ribbon负责均衡的使用讲述完毕