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
- join
spring-cloud-starter-openfeign
Dependencies 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=sentinel
Used to specify the console login user namesentinel
;-Dsentinel.dashboard.auth.password=123456
The 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=7200
Specifies the expiration time of the Spring Boot server session, for example7200
Represents 7200 seconds;60m
Indicates 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:
- Other distributed tracking using SkyWalking native agents and SDKS as well as Zipkin, Jaeger, and OpenCensus.
- 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 use
java -jar
To 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.config
The service name in the configuration file-Dskywalking.collector.backend_service
: used to rewriteagent/config/agent.config
Service 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