一,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就已经搭建出来了
如需代码,可以访问:https://gitee.com/zhenghuisheng/springcloud