SpringCloudAlibaba01(服务注册与发现)
Spring Cloud Alibaba介绍
2018 年 10 月 31 日的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统
** 主要功能包括:**
- 服务限流降级:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
注意组件
- Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
- Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务
- Dubbo:Apache Dubbo 是一款高性能 Java RPC 框架
- Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案
- Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品
- Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据
- Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务
- Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
开发实例
1.版本选择
springcloud基于springboot,两者之间的版本是有相关性的,不同的springcloud版本需要相对应的springboot版本支持。
nacos安装
从官网上下载nacos,解压到一个目录即可,在运行前请确定正确安装了jdk1.8或以上版本,正确配置了JAVA_HOME。
来到安装目录运行startup.cmd即可启动.
创建工程
创建父工程
创建一个maven工程,该工程为父工程,不需要src目录,可以将其删除。编写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"> <modelVersion>4.0.0</modelVersion> <!--父项目名称--> <groupId>com.cjh</groupId> <artifactId>springcloudalibaba</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <!--版本--> <properties> <spring-boot.version>2.3.2.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version> <spring-cloud-ali.version>2.2.3.RELEASE</spring-cloud-ali.version> <spring-cloud-ali-nacos.version>1.3.3</spring-cloud-ali-nacos.version> <spring-cloud-openfeign.version>2.2.2.RELEASE</spring-cloud-openfeign.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <hibernate.version>5.1.0.Final</hibernate.version> </properties> <!--依赖--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-ali.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>${spring-cloud-openfeign.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
创建服务提供者子模块(springboot项目)
依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--引入父工程--> <parent> <groupId>com.cjh</groupId> <artifactId>springcloudalibaba</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.cjh</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>provider</name> <description>Demo project for Spring Boot</description> <dependencies> <!-- 提供web能力 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 从注册中心进行服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 向注册中心进行服务注册 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> <!-- 用于数据校验 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> </dependencies> </project>
application.properties
#端口号 server.port=8009 #服务名称 spring.application.name=service-provider #nacos中ip和端口号 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
在主启动类上添加注解
@EnableDiscoveryClient
启动服务查看注册中心
http://localhost:8848/nacos/
默认用户名:nacos,密码:nacos
创建一个服务
创建一个简单的服务提供者,向外提供restful服务,用于演示服务间的调用
package com.cjh.provider.controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * @author * @site * @company * @create 2020-11-24 18:03 */ @RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { System.out.println("服务提供者........."); return "Hello Nacos Discovery " + string; } }
服务消费者
创建服务消费者模块,具体操作和服务提供者相同。
依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.cjh</groupId> <artifactId>springcloudalibaba</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.cjh</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>Demo project for Spring Boot</description> <dependencies> <!-- 提供web能力 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 声明式服务调用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- 从注册中心进行服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 向注册中心进行服务注册 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> </dependencies> </project>
application.properties
server.port=8080 spring.application.name=server-consumer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
在主启动类上添加注解
@EnableDiscoveryClient
启动服务,查询nacos控制台:
开发一个服务,调用服务提供者提供的服务
restconfig.java
package com.cjh.consumer.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author * @site * @company * @create 2020-11-24 18:09 */ @Configuration public class RestConfig { @LoadBalanced //启动负载均衡 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
controller
package com.cjh.consumer.controller; import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @author * @site * @company * @create 2020-11-24 18:11 */ @RestController public class TestController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) public String echo(@PathVariable String str) { System.out.println("服务消费者 .......... "); return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } }
测试
启动nacos,服务提供者,服务消费者
调用服务消费者他的echo服务,http://localhost:8080/echo/hello word,输出如下信息说明服务正常。