浅谈springcloud入门(七)-SpringCloudAlibaba-服务注册与发现Nacos

一、SpringCloudAlibaba的出现

SpringCloud Netflix 项目进入了维护模式。意味着 SpringCloud Netflix 将不再开发新的组件。维护中的组件将通过平行组件所替代。

当前微服务架构,Dubbo和SpringCloud比较火,另外还有Thrift、gRPC等等 。很多人把SpringCloud 和Dubbo进行对比,其实两个框架并没有太大的可比性,因为他们的定位不同。Spring Cloud是一个完整的微服务解决方案,它提供了微服务各问题的解决方案集合,而Dubbo是一个高性能的RPC框架,它有着很多功能的缺失。

但是很多企业一边想要Dubbo的高性能RPC ,一边又想要Spring Cloud 完整的生态,然后在项目中出现了两个微服务框架的身影 。甚至市面上出现了一些Dubbo和Sprng Cloud的融合方案,但是最终都不是特别成熟。直到Spring Cloud官方出现了Spring Cloud Alibaba 才算是吧Dubbo和Spring Cloud真正的融合在一起。

SpringCloud alibaba学习资料获取:
(1)官网
https://spring.io/projects/spring-cloud-alibaba#overview
(2)英文
https://github.com/alibaba/spring-cloud-alibaba
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
(3)中文
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
 

二、SpringCloudAlibaba是什么?

1、Springcloud Alibaba 的概念:
SpringCloud Alibaba 是微服务开发的一站式解决方案。该项目具备开发分布式应用和服务所需的组件,以至于开发者能够更容易使用 SpringCloud 的编程模型开发分布式应用。使用 SpringCloud Alibaba,只需要添加少量的注解和配置,你就能够给你的应用使用分布式方案,并且使用 Alibaba 中间件 构建一个你自己的分布式系统。

2、SpringCloud Alibaba 的特点:
(1)Flow control and service degradation(流量控制和服务降级):默认支持 Servlet、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的介入,可以在运行时通过控制台修改限流降级规则,还支持查看限流降级的 Metrics 监控。

(2)Service registeration and discovery(服务注册与发现):适配 SpringCloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

(3)Distributed configuration(分布式配置管理):支持分布式系统中的外部化配置,配置更改时自动刷新。

(4)RPC Service(RPC 服务):远程调用服务。

(5)Event-driven(消息驱动):基于 SpringCloud Stream 为微服务应用构建消息驱动能力。

(6)Alibaba Cloud Object Storage(阿里云对象存储):阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

(7)Alibaba Cloud SchedulerX(阿里云调度器):提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如:网格任务,网格任务支持海量子任务均匀分布到所有的 Woker(schedulerx-client)上执行。

(8)Alibaba Cloud SMS(阿里云短信):提供阿里云短信服务支持。
 

三、如何使用SpringCloudAlibaba?

父项目模块导入依赖即可

 <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.1.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>

四、服务注册与发现Nacos

 1、什么是Nacos?

Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开 发者提供一款便捷、简单上手的开源框架。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范 式、云原生范式) 的服务基础设施。

 2、Nacos的作用?

Nacos主要提供以下四大功能

1、服务发现和服务健康测

Nacos 使服务更容易注册,并通过DNS或HTTP接口发现其他服务, Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

2、动态配置服务

动态配置服务允许您在所有环境中以集中和动态的方式管理所有服 务的配置。Nacos消除了在更新配置时重 新部署应用程序, 这使配置的更改更加高效和灵活。

3、动态 DNS 服务

Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服 务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便查阅及发现。

4、服务及其元数据管理

Nacos能让您从微服务平台建设的视觉管理数据中心的所有服务及 元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、 服务的健康状态、服务的流量管理、路由及安全策略。
 

3、Nacos的配置

既然Nacos如此好用,下面我们就讲一讲Nacos的配置。

官方提供了Nacos的服务端供我们下载使用,我们启动Nacos后将我们的微服务注册进入Nacos即可。

下载地址:Releases · alibaba/nacos · GitHub

启动Nacos:解压后,

  • windows执行bin目录下的startup命令 :startup.cmd -m standalone

  • linux 执行 :sh startup.sh -m standalone

访问Nacos,端口8848:http://127.0.0.1:8848/nacos/index.html ,用户名和密码都是:nacos

登录成功之后

找到nacos安装目录config/application.properties 文件,编辑数据库信息,修改内容如下

spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

4、项目搭建

**父工程搭建**

<!--公共的一些配置-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>

  </properties>

  <!--SpringBoot-->
  <parent>
    <groupId> org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
  </parent>

  <!--SpringCloud-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.1.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
  </dependencies>

服务注册到Nacos

导入依赖

   <dependency>
            <groupId>com.alibaba.cloud </groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--加入WEB依赖是为了方便后面写Controller-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

启动类配置

@SpringBootApplication
@EnableDiscoveryClient
public class UserServerApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(UserServerApplication.class,args);
    }
}

yml配置

server:
  port: 10010
spring:
  application:
    name: user-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848	#注册中心地址
temp:
  notify: 588855

启动测试

启动服务提供者,观察Nacos服务列表 , user-server已经注册进去了

服务通信

用户服务(user-server)作为服务提供者需要编写接口返回User实体对象,订单服务(order-server)作为消费者需要调用用户服务获取User实体对象,浏览器调用订单服务,订单服务调用用户服务或到User实体后返回给容器,用户和订单都注册到Nacos中。

 

同样的将order注册到Nacos,步骤和前面一致。

user的controller

@RestController
@RefreshScope  //刷新配置
@RequestMapping("/user")
public class UserController {

    @Value("${server.port}")
    private String port;
    @Value("${temp.notify}")
    private String notify;

    @Value("${redisss}")
    private String redisss;


    @GetMapping("/{id}")
    //限流降级
    @SentinelResource(value = "user",blockHandler = "currentLimiting",fallback = "fusing")
    public User getUser(@PathVariable("id") Long id) {
       int i = 1 / 0;	//方法异常,触发熔断
        return new User(id,"天生我才","会须当饮三百杯" + port + notify+";" +redisss );
    }

 在order中UserFeignClient

//@FeignClient("user-server")使用FeignClient调用服务名为user-server用户服务
@FeignClient(value = "user-server", fallbackFactory = UserFeignClientFallbackFactory.class )
public interface UserFeignClient {
    //调用用户服务的接口
    //最终完整调用用户服务的Url:"http://user-server/user/" + id
    @GetMapping("/user/{id}")
    User getUser(@PathVariable("id") Long id);


}

controller

@SpringBootApplication
// 不加此注解默认也开启客户端功能
@EnableDiscoveryClient
//开启feign客户端
@EnableFeignClients
public class OrderServerApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(OrderServerApplication.class,args);
    }
}

五、Nacos配置管理

Nacos作为Spring Cloud Alibaba的一个重要组件,它不仅可以用作服务注册与发现,也可以用来替代Spring Cloud Config作为统一配置文件管理,而且他的使用更为简单和人性化。

1、导入依赖
<!--        配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
2、写 yml 配置文件:bootstrap.yml 、application.yml。

问题:为什么需要两个 yml 配置文件?
Nacos 和 SpringCloud Config 一样,在项目初始化时,要保证从配置中心进行配置拉取,拉取配置后才能保证项目正常启动。SpringBoot 中配置文件的加载是存在优先级顺序的:bootstrap 优先级高于 application 。
(1)bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 #配置中心,可以在本地再配一个application,但访问优先级是云端,因为bootstrap.yml优先级最高
        prefix: application-user #配置文件前缀
        file-extension: yml #配置文件后缀
        shared-configs: application-common-dev.yml #公共配置
    sentinel:
      transport:
        dashboard: localhost:1111

(2)application.yml

server:
  port: 10010
spring:
  application:
    name: user-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848	#注册中心地址
temp:
  notify: 588855
3、主启动类
 @SpringBootApplication
@EnableDiscoveryClient
public class UserServerApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(UserServerApplication.class,args);
    }
}
4、controller 类
@Value("${temp.notify}")
    private String notify;

    @Value("${redisss}")
    private String redisss;


    @GetMapping("/{id}")
    //限流降级
    @SentinelResource(value = "user",blockHandler = "currentLimiting",fallback = "fusing")
    public User getUser(@PathVariable("id") Long id) {
       int i = 1 / 0;	//方法异常,触发熔断
        return new User(id,"天生我才","会须当饮三百杯" + port + notify+";" +redisss );
    }
5、测试

启动Nacos, 修改Nacos中的配置文件内容,然后访问 localhost:8848/user/user/1 ,观察控制台打印的 “notify”的值会发生变化

细节

  • 云端配置文件的后缀应该是 yaml而不是yml

  • 客户端配置需要指定:spring.profiles.active=dev 环境名

  • 客户端配置 :前缀 + 环境名 + 后缀应该和云端配置文件的DataId一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚者的utopia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值