目录
4.2: 提供者8001和8002的pom的controller
5.6:调用8003返回不同的端口号,证明8003负载调用了8001和8002
1:安装nocas
下载:官网https://github.com/alibaba/nacos/releases下载版本
解压:解压到自己的文件夹下边
运行:Linux/Unix/Mac,启动命令(standalone代表着单机模式运行,非集群模式): sh startup.sh -m standalone
查看:http://localhost:8848/nacos/#/login 账户密码都是nocas
2:什么是nocas
2.1:为什么使用SpringCloudAlibaba
1:springcloud官网的Eurake、Feign、Hystrix、Zuul、Config、Bus都已经停止了更新,进入维护阶段。导致后劲乏力
2:国产的SpringCloudAlibaba,兼容性能强,组件少,一个组件能代替springcloud的好几个组件,减少学习成本
3:国产的SpringCloudAlibaba在阿里中,能够应对双十一的压力,证明产品可靠性高
4:国产的SpringCloudAlibaba,学习使用更加简单方便,易于学习,页面管理也很方便。
2.2:什么是nacos
nocas是SpringCloudAlibaba的一个组件,主要用来实现服务注册,服务发现,动态配置管理服务发现是微服务体系结构中的关键组件之一。在这样的体系结构中,为每个客户端手动配置服务列表可能是艰巨的任务,并且使动态扩展极为困难。Nacos Discovery帮助您自动将服务注册到Nacos服务器,并且Nacos服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery注册服务实例的一些元数据,例如主机,端口,运行状况检查URL,Nacos主页。
nocas=Eurake(服务注册服务发现)+config(配置文件统一管理,但不能统一推送)+Bus(消息队列实现配置文件统一推送)
3:案例架构
在案例中8001,8002,8003向nocas注册服务,然后8001、8002作为相同的服务集群,给8003调用
给8003调用负载均衡调用8001和8002,得到服务器的端口号
4:服务提供者使用案例
父类项目pom配置
-
-
-
<!--父工程 springboot 2.1.3-->
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>2.1.3.RELEASE
</version>
-
-
</parent>
-
-
<!--统一jar的版本管理-->
-
<properties>
-
<project.build.sourceEncoding>UTF-8
</project.build.sourceEncoding>
-
<project.reporting.outputEncoding>UTF-8
</project.reporting.outputEncoding>
-
<java.version>1.8
</java.version>
-
<spring-cloud.version>Greenwich.RELEASE
</spring-cloud.version>
-
<spring-cloud-alibaba.version>2.1.0.RELEASE
</spring-cloud-alibaba.version>
-
-
</properties>
-
-
<!--父工程管理子项目 子项目不用指定版本号 子项目需要引入具体的需求包-->
-
<dependencyManagement>
-
<dependencies>
-
<!--springcloud 包Greenwich-->
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-dependencies
</artifactId>
-
<version>${spring-cloud.version}
</version>
-
<type>pom
</type>
-
<scope>import
</scope>
-
</dependency>
-
<!--springcloud阿里巴巴包 采用2.1-->
-
<dependency>
-
<groupId>com.alibaba.cloud
</groupId>
-
<artifactId>spring-cloud-alibaba-dependencies
</artifactId>
-
<version>${spring-cloud-alibaba.version}
</version>
-
<type>pom
</type>
-
<scope>import
</scope>
-
</dependency>
-
-
</dependencies>
-
-
</dependencyManagement>
-
-
-
-
-
-
</project>
4.1:提供者8001和8002的pom
-
<dependencies>
-
-
<!--nocas依赖-->
-
<dependency>
-
<groupId>com.alibaba.cloud
</groupId>
-
<artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
-
</dependency>
-
-
<!--Spring web 依赖-->
-
<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>
-
-
-
-
</dependencies>
4.2: 提供者8001和8002的pom的controller
该controller只提供一个返回端口的方法,没有业务逻辑,专注与架构
-
/**
-
* @author :huyiju
-
* @date :2020-05-15 21:03
-
*/
-
@RestController
-
public
class Controller {
-
-
@Value("${server.port}")
-
String port;
-
@RestController
-
public
class add {
-
@GetMapping(value = "/add")
-
public String add() {
-
-
return
"服务端nocas端口号:"+port;
-
}
-
}
-
-
}
4.3: 提供者8001和8002的properties
-
#服务信息
8002 或者
8001
-
server.port=
8002
-
#服务名字需要一致,才是同一个服务下的集群
-
spring.application.name=huyiju-nacosservice
-
#服务注册的nocas地址
-
spring.cloud.nacos.discovery.server-addr=
127.0
.0
.1:
8848
-
management.endpoints.web.exposure.include=*
4.4: 提供者8001和8002的main方法
-
@SpringBootApplication
-
@EnableDiscoveryClient
//nocas服务发现注解
-
public
class Mian8002 {
-
public static void main(String[] args) {
-
SpringApplication.run(Mian8002.class,args);
-
-
}
-
}
4.5:启动查看
5:消费者使用案例
5.1:消费者8003的pom
-
<dependencies>
-
-
<!--nacos的服务注册配置-->
-
<dependency>
-
<groupId>com.alibaba.cloud
</groupId>
-
<artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
-
</dependency>
-
<!--nacos的config配置 用于动态配置-->
-
<dependency>
-
<groupId>com.alibaba.cloud
</groupId>
-
<artifactId>spring-cloud-starter-alibaba-nacos-config
</artifactId>
-
</dependency>
-
-
<!--Spring web 依赖-->
-
<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>
-
-
-
</dependencies>
5.2:消费者8003的properties
-
-
#
1:项目初始化配置项目名字
-
spring.application.name=nacos
-8003
-
server.port=
8003
-
#服务注册到nacos.discovery
-
spring.cloud.nacos.discovery.server-addr=
127.0
.0
.1:
8848
-
management.endpoints.web.exposure.include=*
-
-
-
#
2:配置文件读取地址
-
spring.cloud.nacos.config.server-addr=
127.0
.0
.1:
8848
-
#文件后缀
-
spring.cloud.nacos.config.file-extension=yaml
-
-
#配置不同的环境
-
spring.profiles.active=info
-
-
#自定义组文件
-
spring.cloud.nacos.config.group=huyiju
-
-
#自定义命名空间
-
#spring.cloud.nacos.config.namespace=b726e92d-6766-4e05-b35b-a2128c25f00e
-
-
5.3:消费者8003的controller
该controller通过resttemple调用服务,得到端口号
-
@RestController
-
@RefreshScope
//动态刷新获取config,config的注解
-
public
class Controller {
-
-
/**
-
* 调用nocas上注册的服务
-
* 采用restTemplate1+robbin的LoadBalanced注解
-
* @return
-
*/
-
@Resource
-
private RestTemplate restTemplate1;
-
-
@RequestMapping(value = "/get")
-
public String add (){
-
String url=
"http://huyiju-nacosservice/add";
-
System.out.println(
"进入调用");
-
return restTemplate1.getForObject(url,String.class);
-
-
}
-
}
-
-
-
@Configuration
-
public
class RestConfig {
-
@Bean
-
@LoadBalanced
-
public RestTemplate getRestTemplate(){
-
return
new RestTemplate();
-
}
-
}
5.4:消费者8003的mian方法
-
@ComponentScan(basePackages = {"com.thit"})
-
@SpringBootApplication
-
@EnableDiscoveryClient
//服务发现注解
-
public
class Mian8003 {
-
public static void main(String[] args) {
-
SpringApplication.run(Mian8003.class,args);
-
}
-
-
-
}
5.5:启动查看
5.6:调用8003返回不同的端口号,证明8003负载调用了8001和8002
6:动态配置使用
我们使用8003来获取nocas的动态配置
6.1:8003的properties
-
-
#
1:项目初始化配置项目名字
-
spring.application.name=nacos
-8003
-
server.port=
8003
-
#服务注册到nacos.discovery
-
spring.cloud.nacos.discovery.server-addr=
127.0
.0
.1:
8848
-
management.endpoints.web.exposure.include=*
-
-
-
#
2:配置文件读取地址
-
spring.cloud.nacos.config.server-addr=
127.0
.0
.1:
8848
-
#文件后缀
-
spring.cloud.nacos.config.file-extension=yaml
-
-
#配置不同的环境
-
spring.profiles.active=info
-
-
#自定义组文件
-
spring.cloud.nacos.config.group=huyiju
-
-
#自定义命名空间
-
#spring.cloud.nacos.config.namespace=b726e92d-6766-4e05-b35b-a2128c25f00e
-
-
6.2:服务器新建配置
6.3:controller方法
-
/**
-
* 读取指定名字的yml文件
-
* nacos-8003-dev.yaml
-
* 项目名字-环境.yaml
-
*/
-
@Value("${aa.bb}")
-
public String aa;
-
@RequestMapping(value = "/dev")
-
public String dev (){
-
System.out.println(
"读取dev配置文件");
-
return aa;
-
-
}
-
-
/**
-
* 读取指定名字的yml文件
-
* nacos-8003-test.yaml
-
* 项目名字-环境.yaml
-
*/
-
@Value("${aa.bb}")
-
public String bb;
-
@RequestMapping(value = "/test")
-
public String test (){
-
System.out.println(
"读取test配置文件");
-
return bb;
-
-
}
-
-
/**
-
* 自定义group获取指定文件
-
*
-
*
-
*/
-
@Value("${aa.bb}")
-
public String cc;
-
@RequestMapping(value = "/group")
-
public String group (){
-
System.out.println(
"读取group配置文件");
-
return cc;
-
-
}
-
-
/**
-
* 自定义group获取指定文件和自定义命名空间
-
*
-
*
-
*/
-
-
@Value("${aa.bb}")
-
public String ff;
-
@RequestMapping(value = "/namespece")
-
public String namespece (){
-
System.out.println(
"读取group分组和自定义命名空间-配置文件");
-
return ff;
-
-
}
-
7:nocas的cap问题(支持AP和CP的切换)
Nacos的AP和CP模式切换
C:是所有节点在同一时间看到的数据是一致,数据一致行
A:是所有请求都会收到响应,Nocas高可用性
何时选用哪种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式。CP模式下支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
8:nocas的集群和持久化(具体部署请查阅官网)
官方推荐nocas在生产环境尽量使用集群,3台以上的nocas服务中心,一个mysql数据库用来维持数据一致性。一个niginx代理3台nocas服务,只需访问nignx地址进入nocas服务页面