Fegin fusing

Sentinel ADAPTS to Feign components. If you want to use it, in addition to introducing the spring-cloud-starter-Alibaba-Sentinel dependency, there are two steps:

  • Config file to open Sentinel support for Feign:feign.sentinel.enabled=true
  • joinspring-cloud-starter-openfeignDependencies enable the automated configuration classes in Sentinel Starter:

And modify TestClient as follows:

@FeignClient(value = "hello-spring-cloud-alibaba-nacos-provider",fallbackFactory = TestClientImpl.class)
public interface TestClient {
    @RequestMapping("/hi")
    String sayHi(@RequestParam("msg")String msg);
}
Copy the code
@Component
public class TestClientImpl implements FallbackFactory<TestClient> {
    @Override
    public TestClient create(Throwable throwable) {
        return new TestClient() {
            @Override
            public String sayHi(String msg) {
                return "hi ,this is err! but you msg = "+msg+! "" And you fail reason is "+throwable.getMessage(); }}; }}Copy the code

Restart the project again and stop the provider service from accessing http://localhost:8763/hi to get the following fusible result:

hi ,this is err! but you msg = hello-spring-cloud-alibaba-nacos-feign-consumer! And you fail reason is com.netflix.client.ClientException: Load balancer does not have available server for client: hello-spring-cloud-alibaba-nacos-provider

Sentinel console

1. An overview of the

Sentinel provides a lightweight open source console that provides machine discovery as well as health management, monitoring (single and cluster), rule management and push capabilities. In addition, authentication is essential in production environments. Here, we’ll detail how these features can be used in simple steps.

Next, we’ll take a step-by-step look at how to integrate the Sentinel core library and Dashboard to get the most out of it. We also offer an enterprise-class console on AliYun: AHAS Sentinel Console. You can see how the console implements these functions in just a few simple steps.

The Sentinel console contains the following features:

  • View the machine list and health: Collect heartbeat packets sent by the Sentinel client to determine whether the machine is online.
  • Monitoring (single machine and cluster aggregation) : The monitoring API exposed by Sentinel client is used to periodically pull and aggregate application monitoring information, and finally achieve real-time monitoring at the second level.
  • Rule management and push: Manages push rules in a unified manner.
  • Authentication: Authentication is important in the production environment. Each developer needs to customize this for his or her own situation.

Note: Sentinel console currently supports standalone deployment only.

2. Start the console

2.1 Obtaining the Sentinel Console

You can download the latest version of the console JAR package from the Release page.

You can also build the Sentinel console yourself from the latest version of the source code:

  • Download Console Engineering
  • Package the code into a fat JAR using the following command:mvn clean package

2.2 start

Note: JDK version 1.8 or later is required to start the Sentinel console.

Use the following command to start the console:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
Copy the code

-dserver. port=8080 specifies the Sentinel console port as 8080.

Starting with Sentinel 1.6.0, the Sentinel console introduced basic login functionality, with the default user name and password being Sentinel. For details about how to configure the user name and password, see the authentication module documentation.

You can set the following parameters:

  • -Dsentinel.dashboard.auth.username=sentinelUsed to specify the console login user namesentinel;
  • -Dsentinel.dashboard.auth.password=123456The login password used to specify the console is123456; If these two parameters are omitted, the default user name and password are bothsentinel;
  • -Dserver.servlet.session.timeout=7200Specifies the expiration time of the Spring Boot server session, for example7200Represents 7200 seconds;60mIndicates 60 minutes. The default value is 30 minutes.

It can also be configured directly in the Spring Properties file.

Note: When deploying multiple consoles, sessions are not shared between instances by default, and this needs to be modified.

3. Connect the client to the console

After the console starts, perform the following steps to connect the client to the console.

For our microservices, we use the fegin project above, which we add directly to application.yml

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080
Copy the code

The spring here. Cloud. Sentinel. Transport. The port port configuration in the application of equivalent machine start an Http Server, the Server will make interaction with sentinel console. For example, when the Sentinel console adds a limiting rule, it pushes the rule data to the Http Server, which then registers the rule with Sentinel.

Then restart the project.

Let’s test the flow control function of Sentinel:

Let’s see what happens when we add a QPS limit to the hi interface and make more than one request per second.

Refresh our request continuously: http://localhost:8763/hi

It was interrupted by the fuse we wrote earlier.

So far we have successfully integrated Sentinel.

We have used Sentinel for fusing and flow control on the console, all of which are OK. There are many other functions, you can refer to the official documents if you are interested

Spring Cloud Gateway

Introduction to the

Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.

The Spring Cloud Gateway aims to provide a simple and efficient way to route apis and provide cross-domain attention to them, such as: security, monitoring/measurement, and resiliency.

We have already used another Zuul gateway component before, so we won’t go into more details here.

noun

  • Route: It is the basic building block of a gateway. It consists of an ID, a target URI, a predicate set, and a filter set. If the aggregation predicate is true, the route is matched.
  • Predicate: This is a Java 8 function Predicate. The input type is Spring Framework ServerWebExchange. This allows you to match everything in the HTTP request, such as headers or parameters.
  • Filters: These are instances of the Spring Framework GatewayFilter constructed using a specific factory. Here, you can modify the request and response before or after sending the downstream request.

The working process

The client makes a request to the Spring Cloud Gateway. If the gateway handler map determines that the request matches the route, it is sent to the gateway Web handler. The handler runs the request through a chain of request-specific filters. The reason why filters are separated by dashed lines is that the filter can run logic before and after the agent request is sent. All “pre-filter” logic is executed. The proxy request is then issued. After the broker request is issued, the post-filter logic runs.

For urIs defined in routes without ports, the default port values for HTTP and HTTPS URIs are 80 and 443, respectively.

Create a project for gateway

The pom.xml file is as follows


      
<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.wujie</groupId>
        <version>0.0.1 - the SNAPSHOT</version>
        <artifactId>hello-spring-cloud-alibaba-dependencies</artifactId>
    </parent>
    <groupId>com.wujie</groupId>
    <artifactId>hello-spring-cloud-alibaba-nacos-gateway</artifactId>
    <version>0.0.1 - the SNAPSHOT</version>
    <name>hello-spring-cloud-alibaba-nacos-gateway</name>
    <description>Create a gateway based on the gateway</description>



    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.1. RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.5. RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>



    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.0. RELEASE</version>
                <configuration>
                    <mainClass>
                        com.wujie.hello.spring.cloud.alibaba.nacos.gateway.HelloSpringCloudAlibabaNacosGatewayApplication
                    </mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
Copy the code

application.yml

server:
  port: 8765

spring:
  application:
    name: hello-spring-cloud-alibaba-nacos-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        - id: fegin
          uri: lb://hello-spring-cloud-alibaba-nacos-feign-consumer
          predicates:
            - Path=/**
        - id: rest
          uri: lb://hello-spring-cloud-alibaba-nacos-rest-consumer
          predicates:
            - Path=/**
      discovery:
        locator:
          lower-case-service-id:management: true
          enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
Copy the code

Add the @enableDiscoveryClient annotation to the startup class after the startup project is accessed

http://localhost:8765/hello-spring-cloud-alibaba-nacos-rest-consumer/hi

http://localhost:8765/hello-spring-cloud-alibaba-nacos-feign-consumer/hi

Getting results like this proves that at least we don’t have a problem right now. However, we found that this method of using the service name to call is too boring, too long, and inconvenient. This is where we modify the following configuration in application.yml

- id: fegin
  uri: lb://hello-spring-cloud-alibaba-nacos-feign-consumer
  predicates:
    - Path=/fegin/**
  filters:
    - StripPrefix=1
- id: rest
  uri: lb://hello-spring-cloud-alibaba-nacos-rest-consumer
  predicates:
    - Path=/rest/**
  filters:
    - StripPrefix=1
Copy the code

Then change to the following access mode:

http://localhost:8765/rest/hi

http://localhost:8765/fegin/hi

In this comparison, it is obvious that the second option is better.

There are many similar configurations, not to mention predicates and filters, but you can check the Gateway website for yourself

Appendix: More configuration items

Name Default Description
spring.cloud.gateway.default-filters List of filter definitions that are applied to every route.
spring.cloud.gateway.discovery.locator.enabled false Flag that enables DiscoveryClient gateway integration.
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression true SpEL expression that will evaluate whether to include a service in gateway integration or not, defaults to: true.
spring.cloud.gateway.discovery.locator.lower-case-service-id false Option to lower case serviceId in predicates and filters, defaults to false. Useful with eureka when it automatically uppercases serviceId. so MYSERIVCE, would match /myservice/**
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix The prefix for the routeId, defaults to discoveryClient.getClass().getSimpleName() + “_”. Service Id will be appended to create the routeId.
spring.cloud.gateway.discovery.locator.url-expression ‘lb://’+serviceId SpEL expression that create the uri for each route, defaults to: ‘lb://’+serviceId.
spring.cloud.gateway.enabled true Enables gateway functionality.
spring.cloud.gateway.fail-on-route-definition-error true Option to fail on route definition errors, defaults to true. Otherwise, a warning is logged.
spring.cloud.gateway.filter.remove-hop-by-hop.headers
spring.cloud.gateway.filter.remove-hop-by-hop.order
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key true Switch to deny requests if the Key Resolver returns an empty key, defaults to true.
spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code HttpStatus to return when denyEmptyKey is true, defaults to FORBIDDEN.
spring.cloud.gateway.filter.secure-headers.content-security-policy default-src ‘self’ https:; font-src ‘self’ https: data:; img-src ‘self’ https: data:; object-src ‘none’; script-src https:; style-src ‘self’ https: ‘unsafe-inline’
spring.cloud.gateway.filter.secure-headers.content-type-options nosniff
spring.cloud.gateway.filter.secure-headers.disable
spring.cloud.gateway.filter.secure-headers.download-options noopen
spring.cloud.gateway.filter.secure-headers.frame-options DENY
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies none
spring.cloud.gateway.filter.secure-headers.referrer-policy no-referrer
spring.cloud.gateway.filter.secure-headers.strict-transport-security max-age=631138519
spring.cloud.gateway.filter.secure-headers.xss-protection-header 1; mode=block
spring.cloud.gateway.forwarded.enabled true Enables the ForwardedHeadersFilter.
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping false If global CORS config should be added to the URL handler.
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.httpclient.connect-timeout The connect timeout in millis, the default is 45s.
spring.cloud.gateway.httpclient.max-header-size The max response header size.
spring.cloud.gateway.httpclient.max-initial-line-length The max initial line length.
spring.cloud.gateway.httpclient.pool.acquire-timeout Only for type FIXED, the maximum time in millis to wait for aquiring.
spring.cloud.gateway.httpclient.pool.max-connections Only for type FIXED, the maximum number of connections before starting pending acquisition on existing ones.
spring.cloud.gateway.httpclient.pool.max-idle-time Time in millis after which the channel will be closed. If NULL, there is no max idle time.
spring.cloud.gateway.httpclient.pool.max-life-time Duration after which the channel will be closed. If NULL, there is no max life time.
spring.cloud.gateway.httpclient.pool.name proxy The channel pool map name, defaults to proxy.
spring.cloud.gateway.httpclient.pool.type Type of pool for HttpClient to use, defaults to ELASTIC.
spring.cloud.gateway.httpclient.proxy.host Hostname for proxy configuration of Netty HttpClient.
spring.cloud.gateway.httpclient.proxy.non-proxy-hosts-pattern Regular expression (Java) for a configured list of hosts. that should be reached directly, bypassing the proxy
spring.cloud.gateway.httpclient.proxy.password Password for proxy configuration of Netty HttpClient.
spring.cloud.gateway.httpclient.proxy.port Port for proxy configuration of Netty HttpClient.
spring.cloud.gateway.httpclient.proxy.username Username for proxy configuration of Netty HttpClient.
spring.cloud.gateway.httpclient.response-timeout The response timeout.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout 3000ms SSL close_notify flush timeout. Default to 3000 ms.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout-millis
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout SSL close_notify read timeout. Default to 0 ms.
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout-millis
spring.cloud.gateway.httpclient.ssl.default-configuration-type The default ssl configuration type. Defaults to TCP.
spring.cloud.gateway.httpclient.ssl.handshake-timeout 10000ms SSL handshake timeout. Default to 10000 ms
spring.cloud.gateway.httpclient.ssl.handshake-timeout-millis
spring.cloud.gateway.httpclient.ssl.key-password Key password, default is same as keyStorePassword.
spring.cloud.gateway.httpclient.ssl.key-store Keystore path for Netty HttpClient.
spring.cloud.gateway.httpclient.ssl.key-store-password Keystore password.
spring.cloud.gateway.httpclient.ssl.key-store-provider Keystore provider for Netty HttpClient, optional field.
spring.cloud.gateway.httpclient.ssl.key-store-type JKS Keystore type for Netty HttpClient, default is JKS.
spring.cloud.gateway.httpclient.ssl.trusted-x509-certificates Trusted certificates for verifying the remote endpoint’s certificate.
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager false Installs the netty InsecureTrustManagerFactory. This is insecure and not suitable for production.
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Max frame payload length.
spring.cloud.gateway.httpclient.websocket.proxy-ping true Proxy ping frames to downstream services, defaults to true.
spring.cloud.gateway.httpclient.wiretap false Enables wiretap debugging for Netty HttpClient.
spring.cloud.gateway.httpserver.wiretap false Enables wiretap debugging for Netty HttpServer.
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.metrics.enabled true Enables the collection of metrics data.
spring.cloud.gateway.metrics.tags Tags map that added to metrics.
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header X-RateLimit-Burst-Capacity The name of the header that returns the burst capacity configuration.
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers true Whether or not to include headers containing rate limiter information, defaults to true.
spring.cloud.gateway.redis-rate-limiter.remaining-header X-RateLimit-Remaining The name of the header that returns number of remaining requests during the current second.
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header X-RateLimit-Replenish-Rate The name of the header that returns the replenish rate configuration.
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header X-RateLimit-Requested-Tokens The name of the header that returns the requested tokens configuration.
spring.cloud.gateway.routes List of Routes.
spring.cloud.gateway.set-status.original-status-header-name The name of the header which contains http code of the proxied request.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled true If the XForwardedHeadersFilter is enabled.
spring.cloud.gateway.x-forwarded.for-append true If appending X-Forwarded-For as a list is enabled.
spring.cloud.gateway.x-forwarded.for-enabled true If X-Forwarded-For is enabled.
spring.cloud.gateway.x-forwarded.host-append true If appending X-Forwarded-Host as a list is enabled.
spring.cloud.gateway.x-forwarded.host-enabled true If X-Forwarded-Host is enabled.
spring.cloud.gateway.x-forwarded.order 0 The order of the XForwardedHeadersFilter.
spring.cloud.gateway.x-forwarded.port-append true If appending X-Forwarded-Port as a list is enabled.
spring.cloud.gateway.x-forwarded.port-enabled true If X-Forwarded-Port is enabled.
spring.cloud.gateway.x-forwarded.prefix-append true If appending X-Forwarded-Prefix as a list is enabled.
spring.cloud.gateway.x-forwarded.prefix-enabled true If X-Forwarded-Prefix is enabled.
spring.cloud.gateway.x-forwarded.proto-append true If appending X-Forwarded-Proto as a list is enabled.
spring.cloud.gateway.x-forwarded.proto-enabled true If X-Forwarded-Proto is enabled.

Zipkin link tracking

Use Zipkin for link tracing, add dependencies to the items you want to track, and add configurations to the configuration file

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
    <version>2.2.5. RELEASE</version>
</dependency>
Copy the code

And add the configuration in application.yml

zipkin:
  base-url: http://localhost:9411
Copy the code

Apache SkyWalking link tracing

What is SkyWalking?

An open source observability platform for collecting, analyzing, aggregating, and visualizing data from services and cloud native infrastructures. SkyWalking provides an easy way to maintain a clear view of your distributed system, even in the entire cloud. It is a modern APM designed specifically for cloud-based container-based distributed systems.

Why SkyWalking

SkyWalking provides a solution for observing and monitoring distributed systems in many different situations. First, SkyWalking, like the traditional approach, provides automated instrumentation proxies for services such as Java, C#, node.js, Go, PHP, and Nginx LUA. (and call for Python and C ++ SDK contributions). In a multilingual, continuously deployed environment, cloud native infrastructures are becoming more powerful, but also more complex. SkyWalking’s service Grid receiver enables SkyWalking to receive telemetry data from service grid frameworks such as Istio/Envoy and Linkerd, enabling users to see the entire distributed system.

SkyWalking provides observable capabilities for services, service instances, and endpoints. The terms service, instance, and endpoint are used everywhere today, so it’s worth defining their specific meanings in the context of SkyWalking:

  • Service: Represents a set/set of workloads that provide the same behavior for incoming requests. You can define the service name when using the instrument agent or SDK. SkyWalking can also use a name that you define in a platform such as Istio.
  • Service Instance: Each individual workload in a Service group is called an Instance. Like the Pod in Kubernetes, it doesn’t have to be a single OS process, but if you use a musical instrument agent, the instance is actually a real OS process.
  • Endpoint: The path in the service for incoming requests, such as the HTTP URI path or gRPC service class + method signature

SkyWalking allows users to understand the topological relationship between services and endpoints, view metrics for each service/service instance/endpoint, and set alert rules.

In addition, you can integrate:

  1. Other distributed tracking using SkyWalking native agents and SDKS as well as Zipkin, Jaeger, and OpenCensus.
  2. Other indicator systems, such as Prometheus, Sleuth (Micrometer).

architecture

Logically, SkyWalking is divided into four parts: probes, platform backend, storage, and UI

  • Probes collect data and reformat it to meet SkyWalking requirements (different Probes support different sources).
  • Platform Backend supports data aggregation, analyzing and driving processes from probes to UI. The analysis includes SkyWalking native tracking and metrics, third parties including Istio and Envoy telemetry, Zipkin tracking formats, and more. You can even customize the aggregation and Analysis by using the Observability Analysis Language for native metrics and the Meter System for extended metrics.
  • Storage Stores SkyWalking data through an open/pluggable interface. You can choose from an existing implementation, such as ElasticSearch, H2, or MySQL cluster managed by Sharding-Sphere, or you can implement your own.
  • UI A highly customizable Web-based interface that allows SkyWalking end users to visualize and manage SkyWalking data.

Quick start

download

Officials have ready for we compiled server version, download address for skywalking.apache.org/downloads/

Start the SkyWalking

Go to the bin directory and run startup.bat

Visit http://localhost:8080 to get to the home page

Service Configuration

We need to use the probe provided by the government to achieve the purpose of monitoring for us. According to the actual situation, we need to achieve three deployment modes

  • IDEA Deployment probe
  • Java Boot mode deployment probe (we are a Spring Boot application and need to usejava -jarTo launch the app.)
  • Docker startup mode deployment probe (not done for now, interested can test)

The probe file is in the agent directory

We use idea to achieve this

Create a new folder in our project to store all the folders and files in our Agent file

To configure the VM Run parameters to modify the project in the project we need, click Run -> EditConfigurations in the menu bar… Here, we take hello-spring-Cloud-Alibaba-nacos-Provider as an example and modify the parameters as follows

-javaagent:D:\workspace\hello-spring-cloud-alibaba-dependencies\hello-spring-cloud-external-skywalking\agent\skywalking- agent.jar -Dskywalking.agent.service_name=nacos-provider -Dskywalking.collector.backend_service=localhost:11800Copy the code
  • -javaagent: Specifies the probe path
  • -Dskywalking.agent.service_name: used to rewriteagent/config/agent.configThe service name in the configuration file
  • -Dskywalking.collector.backend_service: used to rewriteagent/config/agent.configService address in the configuration file

You can see the following log on the console when you start the project:

DEBUG 2020-09-07 18:45:47:972 main AgentPackagePath : The beacon class location is jar:file:/D:/workspace/hello-spring-cloud-alibaba-dependencies/hello-spring-cloud-external-skywalking/agent/skywalking-a gent.jar! /org/apache/skywalking/apm/agent/core/boot/AgentPackagePath.class. INFO 2020-09-07 18:45:47:974 main SnifferConfigInitializer : Config file foundinD:\workspace\hello-spring-cloud-alibaba-dependencies\hello-spring-cloud-external-skywalking\agent\config\agent.config. [SkywalkingAgent 18:45:51. 274-5 - GRPCChannelManager - 0] the DEBUG org.apache.skywalking.apm.dependencies.io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default  logging frameworkCopy the code

To access the url of the previously written tests: http://localhost:8081/hi? msg=testSkyWalking

Go back to the SkyWalking UI and monitor our service

With all of our information, SkyWalking’s use and configuration is complete. There are also many I am not familiar with, can only be simple to use, in the future learning will often be recorded, and share. If there are shortcomings, please point out.

Summary and experience

I found a picture from the Internet:

This chart clearly shows that SpringCloud has many components in maintenance:

Components such as Zuul, Ribbon, Hystrix, HystrixDashboard, Turbine, Turbine Stream have all entered the maintenance period.

By contrast, many of Alibaba’s components perform better and feel faster. It is also easier to build, and the most important thing is the Chinese document, which is a good news for most players in China. If you feel that learning SpringCloud to read English is very painful or even do not want to watch it, but now Chinese students are not willing to watch it, then you can change careers as soon as possible. First we hand over the document, then follow the document to do the work, and then solve the problems, so that we have used each component at least three times, not to say proficient, at least from the zero entry bar. Technology is to constantly explore, practice, can not always be in place.

The ancients said that reviewing the old and knowing the new can be a teacher

The resources