腾讯,又出来一个王炸!

Posted 微笑很纯洁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯,又出来一个王炸!相关的知识,希望对你有一定的参考价值。

技术圈的变化,真的太快了。

1

微服务的核心

2017年,当时我还在一家小的互联网公司做技术负责人,第一次接触微服务感觉很兴奋。

带着技术小伙伴全部替换上 Spring Boot/Cloud 技术栈,作为第一批拓荒者,实实在在踩了很多坑,但也积累了很多一手经验。

到了现在,如果说你不懂微服务架构,几乎都没办法到互联网公司混了,行业普及度以及生态都越来越好。

在微服务架构中,最核心的组件是注册中心,服务之间的发现、调用全靠它来维护,重要性不言而喻。

刚开始我们选择了eureka,后来它不维护了;后来又使用了consul、nacos,但又不支持水平扩展。

直到最近,在技术调研过程中,发现腾讯开源了一个注册中心产品北极星,关注点颇高引发了我的好奇心。

2

快速入门

北极星的官网介绍如下:

北极星是腾讯开源的服务发现和治理中心,致力于解决分布式或者微服务架构中的服务可见、故障容错、流量控制和安全问题。

也就说它不但能解决基本的服务发现和注册功能,还给内置了很多高阶功能,比如动态路由、权重、熔断降级、限流等等。

下面我们来实践一番。

1、部署北极星

北极星分为单机版和集群版,一般我们个人开发演示使用单机版,在生产环境使用集群版本。

下载地址如下:

https://github.com/polarismesh/polaris/releases

我测试的电脑是win系统,所以选择的是版本:

polaris-standalone-release_v1.12.0.windows.amd64.zip


下载到本地解压后执行脚本:install.bat,如果界面报异常:

无法加载文件 D:\\xx\\polaris-standalone-release_v1.12.0.windows.amd64\\install-windows.ps1,因为在此系统上禁止运行脚本。
有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
    + CategoryInfo          : SecurityError: (:) [],ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnauthorizedAccess
请按任意键继续. . .

可在 powershell 执行下面命令后,再次执行脚本:install.bat,即可启动成功。

Set-ExecutionPolicy Unrestricted -Scope CurrentUser

在浏览器中访问:http://localhost:8080/,输入账户密码:polaris/polaris,即可登录北极星后台。

2、服务注册

接下来,我们创建一个项目 polaris-service-provider 注册到服务中心,项目 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    ...


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.tencent.cloud</groupId>
                <artifactId>spring-cloud-tencent-dependencies</artifactId>
                <version>1.7.0-2021.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>


            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <!-- 简单的 Spring Cloud Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
        </dependency>
    </dependencies>


    ...


</project>

项目配置文件 application.yml,内容如下:

server:
  port: 28888
spring:
  application:
    name: EchoServer


  cloud:
    polaris:
      address: grpc://127.0.0.1:8091
      discovery:
        enabled: true
      stat:
        enabled: true
        port: 28082

最后创建一个启动类, 并在启动类中添加基本的 Controller 调用服务,完整的示例代码如下:

@SpringBootApplication
public class SpringCloudProviderApplication 


    @RestController
    static class EchoController 


        private final PolarisDiscoveryProperties properties;
      
        EchoController(PolarisDiscoveryProperties properties) 
            this.properties = properties;
        


        @GetMapping(value = "/echo/string")
        public String echo(@PathVariable String string) 
            return "Hello PolarisMesh " + string + ", I'm " + properties.getService();
        
    


    public static void main(String[] args) 
        SpringApplication.run(SpringCloudProviderApplication.class, args);
    

以上完成后启动项目,如后台启动日志显示:polaris registry, default EchoServer xx.xx.xx.xx:28888 register finished,即代表启动成功。

在北极星后台-服务列表,也可以看到这个这个实例的状态:

3、服务发现

上面示例,是我们提供了一个服务并且注册到了北极星,现在我们再创建一个项目 polaris-service-consumer,用来调用上面提供的服务。

pom.xml文件基本一致,只是增加了 Feign 依赖,用来注入服务调用。

<!-- 引入 Feign 依赖实现 Feign 调用 -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>

配置文件也和上面一致,只需要修改项目名称和端口信息即可,完整的调用示例代码如下:

@SpringBootApplication
@EnableFeignClients
public class SpringCloudConsumerApplication 


        public static void main(String[] args) 
            SpringApplication.run(SpringCloudConsumerApplication.class, args);
        


        @RestController
        static class EchoController 


            private final EchoServerClient client;
            EchoController(EchoServerClient client) 
                this.client = client;
            
            @GetMapping(value = "/echo")
            public String echo(@RequestParam(name = "value") String val) 
                return client.echo(val);
            
        
        @FeignClient(name = "EchoServer")
        public interface EchoServerClient 
            @GetMapping("/echo/value")
            String echo(@PathVariable("value") String value);
        

以上完成后,启动项目同样会在北极星后台-服务列表,看到我们刚刚启动的服务调用方。

4、测试调用

上面第一步我们启动了注册中心北极星,第二步创建了一个服务并且注册到了注册中心,第三步创建一个消费者,可以调用注册中心提供的服务。

接下来做一个测试,访问消费者服务,看是否能够从服务提供者获取到方法中的字符串。

在浏览器中访问地址:

http://localhost:38888/echo?value=neo

结果显示如下,证明我们调用服务提供者成功。

再做这样一个测试,复制项目polaris-service-provider 重命名为polaris-service-provider-2,同时修改项目端口号。

将项目polaris-service-provider中的方法如下;同样项目polaris-service-provider-2 中,将下面的 one 改为 two.

@GetMapping(value = "/echo/string")
public String echo(@PathVariable String string) 
    return "Hello one PolarisMesh " + string + ", I'm " + properties.getService();

依次启动项目polaris-service-provider和polaris-service-provider-2,这样打开北极星后台,我们会发现2个实例。

用浏览器再次多次访问:

http://localhost:38888/echo?value=neo

浏览器展示结果如下:

Hello one PolarisMesh neo, I'm EchoServer
Hello two PolarisMesh neo, I'm EchoServer
Hello one PolarisMesh neo, I'm EchoServer
Hello twoPolarisMesh neo, I'm EchoServer
...

证明2个服务端均被调用,并且自动进行了负载均衡转发。

3

高阶功能

相比于其它注册中心,北极星内置了很多高阶功能。

比如,在 Spring Cloud 体系内,如果要使用动态配置、限流、熔断等功能,还需要借助其它组件。

但北极星将这些功能,都已经集成到组件内部,我们只需要在后台做少量配置即可轻松实现这些功能。

1、动态配置

在项目中总有一些动态参数,我们不想直接固定到项目中,可以根据项目的运行状态来随时调整。

北极星在后台提供了此功能,只需要在后台配置上对应的文件,项目调用的时候指向此文件即可动态读取配置文件内容。

2、动态路由

上面我们在演示的时候,注册了2个服务提供者,默认会自动均衡对外提供服务。

但有时候为了进行灰度测试、蓝绿测试等,也可以通过在请求中添加参数等配置,将服务指向某一个固定的提供者实例。

这些都只需要对项目少量的修改,通过北极星后台设置即可实现。

3、熔断降级和限流

北极星提供熔断功能,根据实时采集的错误率等指标,及时熔断异常的服务、接口、实例或者实例分组,降低请求失败率。 

当负载已经超过了系统的最大处理能力时,北极星提供服务限流功能,可针对不同的请求来源和系统资源进行访问限流,避免服务被压垮。

通过熔断和限流功能,最大程度的保护服务的稳定性,当个别服务器故障时也不影响服务整体功能。

4、可视化

后台提供了服务治理可视化监控视图,方便实时查看服务调用的各项指标。

支持请求量、请求延时和请求成功率的指标查询,支持服务调用关系和多维度的流量曲线查询,实现服务治理功能和流量观测一体化。

4

最后

通过以上的示例,大家应该也能看出来,做为一款注册中心组件,北极星使用起来还是很简单的。

相比其它的注册中心,北极星最大的优势是支持多语言、可水平扩展、跨地域容灾,同时内置很多成熟方案。

像动态路由、熔断、限流等功能,北极星将这些复杂的技术方案简单化,通过后台界面配置即可实现,大大简化了使用微服务的门槛。

目前北极星已经在业内大规模使用,比如微信、腾讯视频、央视频、腾讯会议等,可靠性高达99.999%。

北极星 Github 地址:https://github.com/polarismesh/polaris

也欢迎大家,长按识别下方二维码加入北极星官方交流群,参与交流、讨论:

恰好这两天腾讯云在举行 Techo Day 技术开放日活动,北极星就是本次活动重点给大家介绍的技术之一。 

最后,腾讯将本次技术开放日所有资料和课件都整合成了一份《腾讯云云原生工具指南》,这份资料不但包含微服务等相关技术。 

还有容器、DevOps、安全等课程和解决方案。很多人对云原生的范围是什么、具体有什么实践价值没太大的感知,这份课件材料有助于大家加深理解。

(长按识别即可下载)

点击阅读原文也可以获取,尤其是做开发的程序员,强烈推荐了解下。

以上是关于腾讯,又出来一个王炸!的主要内容,如果未能解决你的问题,请参考以下文章

王炸!微信重大更新!网友炸了~

杭电出了“王炸班”!考研3个清北8个浙大,就业人均起薪30万+

ChatGPT王炸更新!联网get新知识

杭电AI王炸班冲上风口浪尖,本科没毕业就拿年薪百万,人均起薪30万+

杭电AI王炸班冲上风口浪尖,本科没毕业就拿年薪百万,人均起薪30万+

第4代乐视超级电视全系亮相,生态电视“王炸”来了