SpringCloud 简介
java
SpringCloud 版本选型
git
SpringCloud 工程构建
github
SpringCloud —— Eureka 注册中心
web
SpringCloud —— 服务注册进 Eureka 集群
spring
SpringCloud —— Eureka 自我保护
app
SpringCloud —— SpringCloud Consul 实现服务注册中心
负载均衡
SpringCloud —— HystrixDashboard 服务监控
SpringCloud —— Sleuth 分布式请求链路跟踪
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
简单地说:Nacos 就是注册中心 + 配置中心的结合
等价于 Nacos = Eureka + Config + Bus
替代 Eureka 作服务注册中心
替代 Config 作服务配置中心
服务注册发现框架 | CAP 模型 | 控制台管理 | 社区活跃度 |
---|---|---|---|
Eureka | AP | 支持 | 低(2.X 版本闭源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
Nacos 的下载地址 https://github.com/alibaba/nacos/releases
下载以后解压打开 bin 目录,双击 startup.cmd 便可启动 Nacos
启动以后会出现 Nacos 的字样
启动以后访问 http://localhost:8848/nacos 便可访问 Nacos 控制台,可是须要先登陆,用户名和密码默认都为 nacos
登陆以后便可跳转到控制台
官方文档地址 https://spring.io/projects/spring-cloud-alibaba#learn ,目前当前最新的版本是 2.1.0
这是 SpringCloud Alibaba 的一个依赖
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
这里须要添加两个 POM ,一个是父 POM ,一个是本 POM(固然,若是你只有一个微服务的话那就都添加到一个 POM 就好了)
父 POM 中须要添加如下依赖
<!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
本 POM(若是你只是想测试 Nacos 服务注册的话直接添加 Nacos 的依赖就好了)
<dependencies> <!-- SpringCloud Alibaba Nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- SpringBoot整合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> <!--平常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> </dependencies>
主要是这个依赖
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 # 配置地址 # 监控端点所有打开 management: endpoints: web: exposure: include: '*'
记得加上 @EnableDiscoveryClient 注解
package com.java.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author Woo_home * @create 2020/5/20 11:28 */ @EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main(String[] args){ SpringApplication.run(PaymentMain9001.class, args); } }
简单返回字符串就行
package com.java.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 Woo_home * @create 2020/5/20 11:29 */ @RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "Nacos register, serverPort: " + serverPort + "\t id: " + id; } }
运行启动类
刷新一下 Nacos 的控制台界面,点击服务列表选项,能够发现咱们的服务已经注册进来了(这跟 Eureka 是相似的,这里也很少说了),集群数量为 1,实例数为 1 等等
咱们点击一下详情
点击详情选项能够详细地查看服务信息
更多操做这里就不一一展现了,感兴趣的朋友能够本身玩下
若是你想拒绝这个服务注册,你还能够点击删除操做
与模块 9001 同样便可(依赖,配置,代码都是同样便可)
启动 9001 和 9002
刷新一下 Nacos 控制台,能够发现,如今已经有两个服务了,实例数为 2
也能够点击详情进去看下
老规矩,主要是 nacos 的依赖,其它根据须要添加
<dependencies> <!-- SpringCloud Alibaba Nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- SpringBoot整合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> <!--平常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> </dependencies>
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 # 配置地址 # 消费者将要去访问的微服务名称(注册成功进 Nacos 的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
跟前两个模块的启动类是同样的
package com.java.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author Woo_home * @create 2020/5/20 12:26 */ @EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83 { public static void main(String[] args){ SpringApplication.run(OrderNacosMain83.class, args); } }
配置类很简单,只须要声明一个 bean 就好了,为何要这个 bean,等会儿会说
package com.java.springcloud.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author Woo_home * @create 2020/5/20 12:28 */ @Configuration public class ApplicationContextConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } }
package com.java.springcloud.controller; import lombok.extern.slf4j.Slf4j; 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; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; /** * @author Woo_home * @create 2020/5/20 12:29 */ @RestController @Slf4j public class OrderNacosController { @Resource // 写成 @Autowrie 也行,随你喜欢 private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class); } }
启动三个微服务
刷新一下 Nacos 控制台,如今已经成功注册三个服务了(两个服务提供者,一个服务消费者)
访问 http://localhost:83/consumer/payment/nacos/13 测试一下,报错了。。。
缘由是咱们没有在 RestTemplate 加上 @LoadBalanced 注解,加上就好了
添加 @LoadBalanced 注解以后启动服务,再次访问 http://localhost:83/consumer/payment/nacos/13 测试下,如今返回的是 9002 端口的服务
再次刷新一下,如今返回的是 9001 端口的微服务
学过 Ribbon 的朋友会发现(没学过也不要紧,这里有文章能够看下 SpringCloud —— Ribbon),这不是负载均衡么?是的,这是 Nacos 自带的负载均衡,为何 Nacos 会自带负载均衡呢?由于 spring-cloud-starter-alibaba-nacos-discovery 依赖里面添加了 Ribbon 的依赖,也能够说 Nacos 整合了 Ribbon,因此 Nacos 就默认支持了负载均衡
完整代码已上传至码云 代码下载地址