前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud-Alibaba实战 | 服务治理-Nacos Discovery

SpringCloud-Alibaba实战 | 服务治理-Nacos Discovery

作者头像
码神联盟
发布2020-12-07 11:10:36
8610
发布2020-12-07 11:10:36
举报
文章被收录于专栏:码神联盟码神联盟

版权声明:版权所有,未经许可,不得转载,转载或者引用本文内容请注明来源及原作者

相关文章:

  1. 架构演变介绍 | SpringCloud-Alibaba技术栈汇总
  2. SpringCloud-Alibaba | 微服务架构介绍
  3. SpringCloud-Alibaba | 主要功能和常用组件
  4. SpringCloud-Alibaba实战 | 微服务环境搭建

1服务治理

继续上一篇文章的代码来看,我们已经可以实现微服务之间的调用。但是我们把服务提供者的请求地址(ip,端口)等硬编码到了代码中,这种做法存在许多问题,比如:

  • 如果服务者地址发生了变化,就需要手工修改很多代码
  • 如果后续有集群负载的情况下,硬编码无法实现负载均衡
  • 后续服务者会越来越多,不好管理和维护

以上问题是最常见的,如何去解决,这时候就需要通过注册中心动态的实现和管理,这就是服务治理

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。

  • 服务注册
    • 在服务治理的框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除。
  • 服务发现
    • 调用者会向服务注册中心查询服务,并获取所有服务的实例列表,并实现具体服务的访问。

结合上图来看,微服务架构中,有一个很重要的组件是注册中心,在微服务架构中,起到了协调的作用,注册中心主要包括以下几个功能:

  • 服务发现
    • 服务注册:保存服务提供者和订阅者的信息。
    • 服务订阅(查询):调用者调用服务者提供的服务信息,注册中心向订阅者推送服务信息。
  • 服务配置
    • 服务订阅:服务提供者和调用者订阅微服务配置信息。
    • 服务下发:主动将配置推送给服务调用者和服务提供者。
  • 服务检测
    • 检测服务提供者的健康状态,如果发现异常,则自动剔除服务。

2常见注册中心

  • Zookeeper:
    • zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
  • Eureka:
    • Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现,但是现在已经闭源。
  • Consul:
    • Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
  • Nacos:
    • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
    • Nacos = Eureka/Consul + Config + Admin

3Nacos环境搭建

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,Nacos就是一个注册中心,用来管理提供者和调用者的服务操作,注意,是微服务。

接下来,在我们上面的环境中,引入nacos,并将我们的微服务注册。

搭建步骤:

  • 下载nacos
    • https://github.com/alibaba/nacos/releases
    • windows下下载zip,linux下下载tar.gz
  • 将下载的压缩包,解压到本地,解压目录不要出现中文路径
  • 启动nocas
    • nocas启动方式有两种:
      • standalone
      • cluster
    • window启动,切换到bin目录下,执行如下命令:
      • startup.cmd -m standalone
    • linux下启动,切换到bin目录:
      • ./startup.sh -m standalone
  • 访问nocas
    • http://localhost:8848/nacos
    • 默认用户名nacos,密码nacos

4将商品微服务注册到nacos

  • 修改lk-product的pom.xml文件,增加nacos依赖包
代码语言:javascript
复制
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 在启动类上,增加注解@EnableDiscoveryClient
代码语言:javascript
复制
@SpringBootApplication
@EntityScan("com.cloud")
@EnableDiscoveryClient
public class LkProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(LkProductApplication.class, args);
    }
}
  • 在配置文件application.properties中增加nacos配置
代码语言:javascript
复制
spring.cloud.nacos.discovery.server-addr=localhost:8848
  • 启动项目,切换到nacos控制台,查看服务是否注册成功

5将订单微服务注册到nacos

  • 修改lk-order的pom.xml文件,增加nacos依赖包
代码语言:javascript
复制
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 在启动类上,增加注解@EnableDiscoveryClient
代码语言:javascript
复制
@SpringBootApplication
@EntityScan("com.cloud")
@EnableDiscoveryClient
public class LkOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(LkOrderApplication.class, args);
    }
    @Bean
    public RestTemplate getRestTemplate()  {
        return  new  RestTemplate();
    }
}
  • 在配置文件application.properties中增加nacos配置
代码语言:javascript
复制
spring.cloud.nacos.discovery.server-addr=localhost:8848
  • 修改业务控制器OrderController,调用nacos中的商品微服务,红色字体为修改部分
代码语言:javascript
复制
@RestController
@Slf4j
public class OrderController {

    @Autowired
    RestTemplate restTemplate;
    @Autowired
    OrderService orderService;

    @Autowired
    DiscoveryClient discoveryClient;

    //生成订单
    @GetMapping("/lk/saveOrder/{pid}")
    public Order saveOrder(@PathVariable("pid") Integer pid) {
        log.info("用户下单" + pid);

        ServiceInstance serviceInstance = discoveryClient.getInstances("lk-product").get(0);
        String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
        log.info("请求地址为:" + url);
        Product product = restTemplate.getForObject("http://"+url+"/lk/getProduct/" + pid, Product.class);

        log.info("商品信息为:" + JSON.toJSONString(product));
        Order order = new Order();
        order.setUserId(1);
        order.setUserName("用户1");
        order.setProductId(product.getProductId());
        order.setProductName(product.getProductName());
        order.setProductPrice(product.getProductPrice());
        order.setOrderNumber(1);
        orderService.saveOrder(order);
        return order;
    }
}
  • 启动项目,切换到nacos控制台,查看服务是否注册成功

最后验证微服务是否可以使用,在浏览器中继续访问订单接口:

http://localhost:8003/lk/saveOrder/2

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上有猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档