1 什么是注册中心
注册中心在微服务项目中扮演着非常重要的角色,是微服务架构中的纽带,类似于通讯录,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。
2 为什么要使用注册中心
注册中心解决了服务发现的问题。在没有注册中心时候,服务间调用需要知道被调方的地址或者代理地址。当服务更换部署地址,就不得不修改调用当中指定的地址或者修改代理配置。而有了注册中心之后,每个服务在调用别人的时候只需要知道服务名称就好,继续地址都会通过注册中心同步过来。
3 实战
3.1 下载部署
可以从https://github.com/alibaba/nacos/releases下载nacos-server-$version.zip包。解压将conf里面nacos-mysql.sql 脚本导入数据库,并在同目录下的application.properties 中添加自己的数据库信息。然后直接点击bin/startup.cmd -m standalone就可以了。
1)
2)在application.properties中添加自己的数据库
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://xxxx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=xxxx
启动服务:
sh startup.sh -m standalone
nacos控制台
初始账号密码都是nacos
http://ip:8848/nacos/index.html
如果是腾讯云等云产品需要开放8848端口,nacos建议在内网使用,所以我们需要限制8848端口访问的ip。
这个ip如果设置为ipconfig的ip可能不会生效,要设置为以下访问日志中nacos所能识别的ip。
8848需要开放日志中的地址和真实客户端地址,nacos2.x还需要开放端口9848和9849客户端真实地址(nacos和服务部署在同一服务器也需要放开本服务器公网ip)。
腾讯云安全组配置
3.2 引入依赖
<!-- SpringCloud Alibaba 微服务 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Alibaba Nacos 配置 使用nacos2.0 版本需要引入新版本的 client依赖-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.4</version>
</dependency>
<dependencies>
<!-- springcloud alibaba nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- springcloud loadbalancer 负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2 配置yaml
bootstrap.yml:
spring:
application:
# 应用名称 默认的服务注册名
name: mycloud-nacos
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: x.x.x.x:8848
3 启动类
@SpringBootApplication
public class MyCloudNacosApplication {
public static void main(String[] args) {
SpringApplication.run(MyCloudNacosApplication.class, args);
}
@Bean
//负载均衡,一定要配置不然无法远程调用
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@EnableDiscoveryClient 注解,开启 Spring Cloud 的注册发现功能。不过从 Spring Cloud Edgware 版本开始,实际上已经不需要添加 @EnableDiscoveryClient 注解,只需要引入 Spring Cloud 注册发现组件,就会自动开启注册发现的功能。例如说,我们这里已经引入了spring-cloud-starter-alibaba-nacos-discovery 依赖,就不用再添加
@EnableDiscoveryClient 注解了。
后续用到的mycloud-order 服务采用同样的配置就不展示了
4 启动服务
在nacos我们可以看到服务已注册
5 controller测试
@RestController
@RequestMapping("/nacos")
@RefreshScope
@Slf4j
public class TestController {
@Resource
private RestTemplate restTemplate;
@RequestMapping("/test")
public void test(){
log.info("-------nacos------");
//根据mycloud-order 服务名调用
final String str = restTemplate.getForObject("http://mycloud-order/order/test", String.class);
log.info("---------收到的返回值str:{}",str);
}
mycloud-order controller 类:
@RestController
@RequestMapping("/order")
@Slf4j
public class TestController {
@RequestMapping("test")
public String test(){
log.info("-------order------");
return "----来了老弟---";
}
}
调用mycloud-nacos 方法结果:
6 总结
通过向nacos上注册服务,进行服务调用时就可通过 http://服务名/rest路径 进行调用了。