一,springcloud alibaba简介
再介绍一门技术之前,我们一定要先去读他的官网,把它看个两遍三遍的
官网:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
二,nacos讲解
在将结nacos之前,依旧需要先读官网:https://nacos.io/zh-cn/
接下来讲我们的重点了,在学了之前的springclod之后,我们的注册中心和配置中心是使用eureka + config + bus,重点来了,nacos直接将这三个给取代了,而且不需要像之前一样需要重启项目才能进行访问.每次学完旧技术再学新技术,就感觉自己又被坑了。只不过虽然新技术简单,但是思想还是一样的,都是互相 “抄作业” 的。
接下来用一张图来说明nacos的作用,来自官网
三,nacos下载安装以及解决期间遇到的坑
这里使用windows下的作为演示,当然nacos作为集群的部署最终还是需要到linux下进行部署的。
下载官网:https://github.com/alibaba/nacos/releases/tag/1.1.4
解压完成之后,出现以下画面即可
接下来打开conf文件下面的application.properties文件,最好使用notepad++打开,真的是神器。
作如下修改,否则在启动时报错。将前面的 # 号去掉,全部打开处于正常运行状态
再将nccos-mysql.sql脚本丢入到mysql数据库中,并且数据库名称为nacos
再将bin目录下的startup.cmd脚本打开
将26行的改成和下面的一样,都为standalone
接下来打来bin目录,点击startup.cmd运行即可,出现如下画面,则nacos安装成功!
由上图可知,端口号默认为8848,接下来打开浏览器访问一下,输入http://localhost:8848/nacos 即可,账号密码都是nacos,由于我做了集群配置因此出现了以下界面,刚开始肯定是一个登录页面的,我这里回不去了,账号密码一定都是nacos
四,编码以及集群的搭建
首先约定>配置>环境,环境的配置,可以参考我前面的一篇springcloud微服务入门:https://blog.csdn.net/zhenghuishengq/article/details/113790619
1,通用包api-commons
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atgui.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-api-commons</artifactId> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <!--热部署工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.1.0</version> </dependency> </dependencies> </project>
实体类CommonResult
package com.zheng.api.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class CommonResult<T> { private Integer code; //类似404 private String message; //信息描述 private T data; // public CommonResult(Integer code,String message){ this(code,message,null); } }
实体类Payment
package com.zheng.api.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor public class Payment implements Serializable { private long id; private String serial; @Override public String toString() { return "Payment{" + "id=" + id + ", serial='" + serial + '\'' + '}'; } }
2,服务提供者,搭建一个集群,分别为cloudalibaba-provider-payment-9001和cloudalibaba-provider-payment-9002
拿cloudalibaba-provider-payment-9001为例,另一个改一个端口号即可。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atgui.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment-9001</artifactId> <dependencies> <!-- SpringCloud alibaba nacos --> <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <!--引入自己定义的 api 通用包--> <groupId>com.atgui.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!-- 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> </project>
application.yml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置nacos地址 management: endpoints: web: exposure: include: "*"
PaymentController
package com.zheng.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; /** * @author zhenghuisheng * @date 2021/02/16 */ @RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos registry, serverPort: " + serverPort + "\t id" + id; } }
主启动类PaynentMain9001.java
package com.zheng.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class PaynentMain9001 { public static void main(String[] args) { SpringApplication.run(PaynentMain9001.class,args); } }
cloudalibaba-provider-payment-9002在application.yml中改个端口号就行了
server: port: 9002 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置nacos地址 management: endpoints: web: exposure: include: "*"
3,消费者
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atgui.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-config-nacos-client3377</artifactId> <dependencies> <!-- nacos config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- SpringCloud alibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 引入自定义的api通用包,可以使用Payment支付Entity --> <dependency> <!--引入自己定义的 api 通用包--> <groupId>com.atgui.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!-- 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> </project>
bootstrap.yml
没错,就是bootstrap.yml,他与application.yml具有父子级关系,先加载bootstrap.yml再加载application.yml
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 # Nacos 服务注册中心地址 config: server-addr: localhost:8848 # Nacos 作为配置中心地址 file-extension: yaml #指定yaml格式的配置 yml会报错,nacos识别yaml
application.yml
spring: profiles: active: dev # active: test # active: info
ConfigController
package com.zheng.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope //通过SpringCloud原生注解 @RefreshScope 实现配置自动更新 public class ConfigController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
主启动类 ConfigMain3377.java
package com.zheng.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class ConfigMain3377 { public static void main(String[] args) { SpringApplication.run(ConfigMain3377.class,args); } }
五,测试
依旧使用的是Run Dashboard,可以参考springcloud入门的博客,里面有具体的配置
再次打开nacos,在浏览器上输入localhost:8848/nacos,可以发现以下界面。
几个服务名正是我们application.yml里面的服务名
也可以再详情这个按钮中看到
六,总结
根据以上步骤,nacos就已经搭建出来了