Code Monkey home page Code Monkey logo

spring-cloud-huawei-samples's Introduction

Spring Cloud Huawei Samples 中文

This project provide samples for Spring Cloud Huawei. Read each sub-project and wiki for details about each sample.

Directory description:

  • basic:This project providers sample to show working with Spring Cloud Microservices.

  • basic-tomcat:This project provides a simple example of a Spring Boot application running on a standalone Tomcat

  • canary:This project providers sample to show working with Canary Deploy.

  • migrate:Demonstrate the dubbo,eureka, hsf, sofa, nacos and tsf projects and their transformation to spring cloud microservices.

  • porter:This project provides 5 microservices using Spring Cloud Huawei and ServiceComb Java Chassis.

Branches:

  • master: for Spring Cloud 2022.0.x and reqiures JDK 17
  • 2021.0.x: for Spring Cloud 2021.0.x and reqiures JDK 8
  • 2020.0.x: for Spring Cloud 2020.0.x and reqiures JDK 8
  • Hoxton: for Spring Cloud Hoxton(EOL, not for pruducton use)
  • Greenwich: for Spring Cloud Greenwich(Community maintenance is not recommended for production environment)
  • Finchley: for Spring Cloud Finchley(Community maintenance is not recommended for production environment)

Prerequisites

Running samples, must first prepare CSE environment

More information can be found in Huawei Cloud.

And edit bootstrap.yml for each microserivce, configure the correct CSE services, like config center and service center.

Samples using CSE 2.0 in default,the config service is kie

spring:
  cloud:
    servicecomb:
      config:
        serverType: kie
        serverAddr:  http://127.0.0.1:30110

If using CSE 1.0,config service change to config-center.

spring:
  cloud:
    servicecomb:
      config:
        serverType: config-center
        serverAddr:  http://127.0.0.1:30113
        fileSource: consumer.yaml

Cloud Service Engine(CSE)

Cloud Service Engine (CSE) provides service registry, service governance, and configuration management. It allows you to quickly develop microservice applications and implement high-availability O&M. Furthermore, it supports multiple languages and runtime systems, and unified access and governance of intrusive frameworks such as Spring Cloud, Apache ServiceComb (Java Chassis/Go Chassis), and Dubbo, and non-intrusive service meshes.

CSE has two versions: CSE 1.0 and CSE 2.0.

CSE 2.0 provides an exclusive edition of the microservice engine. The microservice engine exclusive edition is a commercial engine that supports large-scale microservice application management. You can select different specifications based on service requirements. Engine resources are exclusively used and the performance is not affected by other tenants.

Compared with CSE 1.0, CSE 2.0 completely upgrades the underlying architecture, functions, security, and performance. It provides independent service registration and discovery centers and configuration centers to support definition and governance based on user service scenarios. Table 1 describes the feature comparison between the two versions.

More informationcan be found in Official Documents .

spring-cloud-huawei-samples's People

Contributors

chengyouling avatar david6969xin avatar dependabot[bot] avatar develpoerx avatar glovethu avatar hujinming178 avatar liubao68 avatar m13922236379 avatar yoc19970520 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

spring-cloud-huawei-samples's Issues

更新项目README文件

包含如下信息:

  1. 下载Local CSE 1.0,以及servicstage链接
  2. 下载Local CSE 2.0, 以及CSE2.0链接
  3. 使用1.0和2.0的差异,及配置注意事项
  4. 补充简短的说明,描述每个子目录的项目的功能说明。

启动报错。java.lang.IllegalStateException: Service id not legal hostname

日志:
16:05:34.439 [main] INFO c.u.j.c.EnableEncryptablePropertiesBeanFactoryPostProcessor 48 - Post-processing PropertySource instances

16:05:34.636 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource configurationProperties [org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource] to AOP Proxy

16:05:34.638 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource bootstrap [org.springframework.core.env.MapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:34.638 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource commandLineArgs [org.springframework.core.env.SimpleCommandLinePropertySource] to EncryptableEnumerablePropertySourceWrapper

16:05:34.639 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource systemProperties [org.springframework.core.env.PropertiesPropertySource] to EncryptableMapPropertySourceWrapper

16:05:34.639 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource systemEnvironment [org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource] to EncryptableSystemEnvironmentPropertySourceWrapper

16:05:34.639 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource random [org.springframework.boot.env.RandomValuePropertySource] to EncryptablePropertySourceWrapper

16:05:34.639 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource springCloudClientHostInfo [org.springframework.core.env.MapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:34.640 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource applicationConfig: [file:bootstrap.yml] (document #2) [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:34.640 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource applicationConfig: [file:bootstrap.yml] (document #0) [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:34.806 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker 335 - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$f25b9ad1] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

16:05:34.913 [main] INFO c.u.j.f.DefaultLazyPropertyFilter 31 - Property Filter custom Bean not found with name 'encryptablePropertyFilter'. Initializing Default Property Filter

16:05:34.929 [main] INFO c.u.j.r.DefaultLazyPropertyResolver 35 - Property Resolver custom Bean not found with name 'encryptablePropertyResolver'. Initializing Default Property Resolver

16:05:34.934 [main] INFO c.u.j.d.DefaultLazyPropertyDetector 35 - Property Detector custom Bean not found with name 'encryptablePropertyDetector'. Initializing Default Property Detector

16:05:35.251 [main] INFO c.u.j.c.EnableEncryptablePropertiesBeanFactoryPostProcessor 48 - Post-processing PropertySource instances

16:05:35.372 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource configurationProperties [org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource] to AOP Proxy

16:05:35.374 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource bootstrap [org.springframework.core.env.MapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:35.374 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource commandLineArgs [org.springframework.core.env.SimpleCommandLinePropertySource] to EncryptableEnumerablePropertySourceWrapper

16:05:35.375 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource systemProperties [org.springframework.core.env.PropertiesPropertySource] to EncryptableMapPropertySourceWrapper

16:05:35.375 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource systemEnvironment [org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource] to EncryptableSystemEnvironmentPropertySourceWrapper

16:05:35.375 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource random [org.springframework.boot.env.RandomValuePropertySource] to EncryptablePropertySourceWrapper

16:05:35.375 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource springCloudClientHostInfo [org.springframework.core.env.MapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:35.376 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource applicationConfig: [file:bootstrap.yml] (document #2) [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:35.376 [main] INFO c.u.j.EncryptablePropertySourceConverter 44 - Converting PropertySource applicationConfig: [file:bootstrap.yml] (document #0) [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper

16:05:35.546 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker 335 - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$f25b9ad1] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

16:05:35.677 [main] INFO c.u.j.f.DefaultLazyPropertyFilter 31 - Property Filter custom Bean not found with name 'encryptablePropertyFilter'. Initializing Default Property Filter

16:05:35.747 [main] INFO c.u.j.r.DefaultLazyPropertyResolver 35 - Property Resolver custom Bean not found with name 'encryptablePropertyResolver'. Initializing Default Property Resolver

16:05:35.752 [main] INFO c.u.j.d.DefaultLazyPropertyDetector 35 - Property Detector custom Bean not found with name 'encryptablePropertyDetector'. Initializing Default Property Detector

. ____ _ __ _ _

/\ / _' __ _ () __ __ _ \ \ \ \

( ( )___ | '_ | '| | ' / _` | \ \ \ \

\/ _)| |)| | | | | || (| | ) ) ) )

' || .__|| ||| |__, | / / / /

=========||==============|/=///_/

:: Spring Boot :: (v2.2.7.RELEASE)

. ____ _ __ _ _

/\ / _' __ _ () __ __ _ \ \ \ \

( ( )___ | '_ | '| | ' / _` | \ \ \ \

\/ _)| |)| | | | | || (| | ) ) ) )

' || .__|| ||| |__, | / / / /

=========||==============|/=///_/

:: Spring Boot :: (v2.2.7.RELEASE)

16:05:36.843 [main] INFO o.s.c.b.c.PropertySourceBootstrapConfiguration 101 - Located property source: CompositePropertySource {name='servicecomb', propertySources=[ServiceCombConfigPropertySource {name='servicecomb'}]}

16:05:36.850 [main] INFO o.s.boot.SpringApplication 655 - The following profiles are active: huaweicloud

16:05:37.849 [main] INFO o.s.c.b.c.PropertySourceBootstrapConfiguration 101 - Located property source: CompositePropertySource {name='servicecomb', propertySources=[ServiceCombConfigPropertySource {name='servicecomb'}]}

16:05:37.856 [main] INFO o.s.boot.SpringApplication 655 - The following profiles are active: huaweicloud

16:05:39.908 [main] ERROR o.s.boot.SpringApplication 826 - Application run failed

java.lang.IllegalStateException: Service id not legal hostname (${external.dict.serviceName})

at org.springframework.util.Assert.state(Assert.java:73)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.getName(FeignClientsRegistrar.java:103)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.getName(FeignClientsRegistrar.java:278)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClient(FeignClientsRegistrar.java:233)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClients(FeignClientsRegistrar.java:219)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerBeanDefinitions(FeignClientsRegistrar.java:144)

at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:384)

at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:383)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)

at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)

at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)

at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)

at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)

at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)

at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)

at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)

at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)

at com.nariit.rmcp.ai.AiApplication.main(AiApplication.java:33)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)

at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)

at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)

at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:597)

16:05:41.160 [main] ERROR o.s.boot.SpringApplication 826 - Application run failed

java.lang.IllegalStateException: Service id not legal hostname (${external.dict.serviceName})

at org.springframework.util.Assert.state(Assert.java:73)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.getName(FeignClientsRegistrar.java:103)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.getName(FeignClientsRegistrar.java:278)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClient(FeignClientsRegistrar.java:233)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClients(FeignClientsRegistrar.java:219)

at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerBeanDefinitions(FeignClientsRegistrar.java:144)

at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:384)

at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:383)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)

at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBea

配置截图: bootstrap.yaml
image

配置中心
image

依赖:
image

feign:
image

Local-CSE arm64 =>? cse: cannot execute binary file

脚本执行异常,可以帮忙看下问题是什么吗?

➜  Local-CSE sh start.sh
start.sh: line 7: /Users/samzonglu/Downloads/Local-CSE/cse: cannot execute binary file

➜  Local-CSE neofetch --stdout
[email protected]
------------------------------------
OS: macOS 12.3.1 21E258 arm64
CPU: Apple M1 Max
Kernel: 21.4.0
Shell: zsh 5.8
Resolution: 1920x1080, 1512x982
Terminal: iTerm2

Spring Cloud Alibaba + Nacos 如何迁移到 Spring Cloud Huawei + CSE

主要迁移步骤

  • 修改pom文件。移除Spring Cloud Alibaba和Nacos相关依赖,并替换为Spring Cloud Huawei相关依赖。
  • 修改bootstrap.yml文件。将Spring Cloud Alibaba和Nacos相关配置, 修改为Spring Cloud Huawei相关配置。
  • 其他修改
    • yaml配置文件迁移
    • 网关流控迁移
    • 应用隔离和环境隔离

basic项目 提供了迁移后的应用示例,迁移过程中涉及到的POM文件修改、bootstrap.yml文件修改等内容,都可以参考这个项目。

修改pom文件

  • dependencyManagement

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>aliyun-spring-boot-dependencies</artifactId>
            <version>{project-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

修改为

  <dependencyManagement>
    <dependencies>
      <!-- configure user spring cloud / spring boot versions -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <!-- configure spring cloud huawei version -->
      <dependency>
        <groupId>com.huaweicloud</groupId>
        <artifactId>spring-cloud-huawei-bom</artifactId>
        <version>${spring-cloud-huawei.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  • dependencies

排除Spring Cloud Alibaba和Nacos相关依赖,并替换为Spring Cloud Huawei相关依赖。这了不详细描述删除那些配置。Spring Cloud Huawei 的配置比较简单, 只需要引入一个 starter 即可。 需要主意网关和微服务的 starter 不同。

微服务starter

    <dependency>
      <groupId>com.huaweicloud</groupId>
      <artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
    </dependency>

网关starter

    <dependency>
      <groupId>com.huaweicloud</groupId>
      <artifactId>spring-cloud-starter-huawei-service-engine-gateway</artifactId>
    </dependency>

修改bootstrap.yml文件

删除 Spring Cloud Alibaba和Nacos相关配置,并增加Spring Cloud Huawei相关配置。 这里不详细描述删除的内容, 增加的内容如下:

spring:
  application:
    name: basic-provider
  cloud:
    servicecomb:
      discovery:
        enabled: true
        watch: false
        # address: https://cse.cn-south-1.myhuaweicloud.com
        address: http://127.0.0.1:30100
        appName: basic-application
        serviceName: ${spring.application.name}
        version: 0.0.1
        healthCheckInterval: 30
      config:
        # serverAddr: https://cse.cn-south-1.myhuaweicloud.com
        serverAddr:  http://127.0.0.1:30113
        fileSource: provider.yaml
        watch:
          delay: 10000

      # Configure AK/SK credentials if needed. Default not enabled.
      credentials:
        enabled: false
        accessKey: your ak
        secretKey: your sk
        akskCustomCipher: defau

其他修改

yaml配置文件迁移

Nacos通过data-id可以指定yaml格式的配置文件。 而CSE第一代引擎只支持key-value的配置,第二代引擎支持更加丰富的配置格式。 本文说明如何用一代引擎提供yaml格式的文件配置。 二代引擎上线后可以直接使用yaml格式 ,就不需要这个方式了。

spring:
  cloud:
    servicecomb:
      config:
        fileSource: configruation1.yaml,configruation2.yaml

bootsrap.yml文件中指定上述配置项, 每个fileSource对应配置中心的一个key,建议以yaml文件名作为key名,例子中定义了两个key:configruation1.yaml和configruation2.yaml 。 然后需要在配置中心录入两个key对应的yaml内容。

网关流控迁移

Spring Cloud Alibaba集成Sentinel以后, 可以通过实现一个 GlobalFilter, 集成sentinel的功能。 Spring Cloud Huawei也可以使用基于动态配置的流量特征治理。 基本开发流程非常简单,只需要在路由Filter中使用该功能即可

spring:
  main:
    web-application-type: reactive
  cloud:
    gateway:
      routes:
        - id: consumer
          uri: lb://basic-consumer
          filters:
            - name: governance  ## 使用基于动态配置的流量特征治理
          predicates:
            - Path=/**
  • 使用动态配置的方式下发流控规则
## rate limiting configuration
servicecomb:
  matchGroup:
    allOperation: |
      matches:
        - apiPath:
            prefix: "/"
  rateLimiting:
    allOperation: |
      rate: 100

流控规则也可以统一放到配置文件,通过配置中心下发。 参考“yaml配置文件迁移”章节的说明。

应用隔离和环境隔离

Spring Cloud Alibaba的Nacos有namespace和group等概念支持逻辑隔离, Spring Cloud Huawei 也支持应用隔离和环境隔离,不同的应用和环境是无法相互发现的,配置也支持不同的下发粒度。配置项:

server:
  env: production # 默认为空, 可以配置 production, testing, development等
spring:
  application:
    name: basic-provider
  cloud:
    servicecomb:
      discovery:
        appName: basic-application # 应用名称。应用名称相同的微服务可以相互调用。 否则不能发现调用。 配置也可以定义应用生效,或者全局生效。
        serviceName: ${spring.application.name}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.