目录
1、首先需要搭建Nacos-server
nacos搭建环境要求
nacos-server下载方式
nacos-server启动
2.搭建服务注册发现和nacos-config配置中心
服务注册发现
config配置中心
3、微服务调用
需求:业务量升级,老大要求使用nacos微服务架构,技研玩了一下,从搭建到使用一整套流程
环境变量Java_home,maven_home自行配置,笔者就不在此处赘述
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
笔者当前用的 nacos-server-1.2.1.tar.gz 这个版本,release 1.3.0 beta还处于beta版本且下载很慢,推荐使用nacos-server-1.2.1.tar.gz (linux) 或者 nacos-server-1.2.1.zip(windows)版本
linux启动命令:sh startup.sh -m standalone
windos启动命令:startup.cmd
默认的登录名nacos 密码 nacos,登录后UI页面如下,还是挺带劲的
如果想修改端口号和context,可以在nacos\distribution\conf目录下找到application.properties文件修改
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848
如果想修改登录名和密码,可以在同目录下的application.properties.example文件进行修改
而且nacos是支持mysql和adb进行数据持久化的
provider的pom依赖:
1.8
2.2.1.RELEASE
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
application.properties配置信息:
## 服务提供者server provider
server.port=8070
spring.application.name=service-provider
##nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#允许其他服务通过注册中心发现该服务#
eureka.instance.prefer-ip-address= true
在启动类上添加注解 @EnableDiscoveryClient,就会向nacos-server注册服务
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
至此生产者provider就此搭建起来了
consumer的pom依赖:
1.8
2.2.1.RELEASE
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
同provider的依赖是一样一样的
application.properties配置信息:
server.port=8111
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
在启动类上添加注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerStartApplication.class, args);
}
}
启动起来了,success!!! 如下
config的pom依赖:
1.8
2.2.1.RELEASE
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
0.2.1.RELEASE
properties配置文件分优先级bootstrap.properties最高,项目启动就要向nacos-server拉取配置数据
bootstrap.properties配置内容:
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-config
spring.cloud.nacos.config.file-extension=properties
management.endpoints.web.exposure.include=*
application.properties配置内容:
spring.profiles.active=dev
server.port=8100
配置中心需要自己写一个读取配置类,
这个类可以从配置中心读取已经配置的属性,@RefreshScope支持动态读取,配置中心更改配置信息后,可以通过这个注解自动刷新,然后通过/actuator/refresh刷新后即可获取(适合节点较少),如果集群节点太多,可以引入spring-cloud-bus服务总线,进行集群同步,通过/actuator/bus_refresh 即可将所有节点同步,就不用重启服务器了,否则运维会拿着10米长大砍刀来砍死你
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache}")
private String useLocalCache;
@RequestMapping("/get")
public String get() {
return useLocalCache;
}
}
启动类:
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
try一下:在配置中心配置下
接口读取一下:
在nacos-server配置中心更改下,不重启服务
调用/actuator/refresh自动刷新
返回值,他会给你哪些key发生了变化,真好!这个可以支持我们局部更新配置属性,不用全量更新了
然后调一下配置读取接口
配置中心的demo over...
在这里笔者演示RestTemplate和OpenFeign两种方式
使用RestTemplate进行远程请求
需要初始化restTemplate模板 @LoadBalanced实现了ribbon负载均衡
@Configuration
@Slf4j
public class BeanConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
log.info("初始化restTemplate模板...");
return new RestTemplate();
}
}
使用demo,需要配置url,入参,返回类型,当然这个需要自己设定好,或者和他人配合约定好
@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
@Autowired
private RestTemplate restTemplate;
private static final String URL_PREFIX="http://service-provider";
@RequestMapping("/getList")
public List getList(){
return this.restTemplate.postForObject(URL_PREFIX+"/getUserList",null,List.class);
}
}
然后在服务提供方provider写一个对应的服务接口
@RestController
@Slf4j
public class NacosProviderController {
@RequestMapping(value="/getUserList")
public List getUserList(){
log.info("开始调用start");
List result=new ArrayList<>();
result.add("test1");
result.add("test2");
result.add("test3");
result.add("test4");
result.add("test5");
result.add("test6");
log.info("调用end");
return result;
}
}
然后启动服务提供者和服务消费者,看效果
可以,序列化他已经帮你做了!!
使用OpenFeign进行远程请求
需要在上面的consumer上面增加feign依赖
org.springframework.cloud
spring-cloud-starter-openfeign
2.2.3.RELEASE
消费者调用使用FeignClient,需要做的就是自己要写一下接口,比RestTemplate工作量要稍微大一点,但是更服务Java的架构思想,各有优劣点,自行选择
@RestController
@RequestMapping(value = "/service-inlet")
public class NacosConsumerController {
@Autowired
private UserApi UserApi;
@RequestMapping("/getFeignList")
public List getFeignList(){
return this.UserApi.getFeignList();
}
}
Feign的方式额外多写个 UserApi 类,FeignClient注解就是表明这个类都要发http请求,value是注册中心的服务提供方的application-name
@FeignClient(value="service-provider")
public interface UserApi {
@RequestMapping(value = "/getUserList",method = RequestMethod.POST)
List getFeignList();
}
最后在启动类上添加@EnableFeignClients,标注这是一个Feign客户端
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerStartApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerStartApplication.class, args);
}
}
启动后,再调用接口查看下使用Feign的效果
也好使!!
两者的优缺点:
RestTemplate:优点-->代码不用冗余写中间接口,易读,缺点--> 代码不优雅,还需要写url
Feign:优点-->代码优雅,一如既往的像之前的那种service和serviceImpl(此时在provider工程里实现的)缺点-->需要额外写中间接口
至此对nacos的技术预研告一段落,相比netflix的那一套eureka,config而言,nacos做的更加集成化,轻量级,而且完全国产化,是阿里巴巴自研微服务框架技术,更重要的和阿里内部的其他消息中间件rocketMq,更加友好,而且最近adb出了mysql版本,叫ads,后期应该也会有更好的融合!