SpringCloud+Eureka初识+Ribbon+Feign

​Eureka注册中心

 1.导包

    <dependencies>
        <!-- http://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.1.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>

        </dependency>
        <!-- http://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
    </dependencies>

 

2.配置文件

server:
  port: 7001
eureka:
  instance:
    hostname: localhost  #eureka服务器的实例
  client:
    register-with-eureka: false
    fetch-registry: false

    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 

3.主启动类: 

package com.lian.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

//启动之后,访问http://localhost:7001/
@SpringBootApplication
@EnableEurekaServer//服务端的启动类
public class EurekaServer_7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer_7001.class,args);
    }
}

 

报错1:Caused by: java.lang.ClassNotFoundException: org.springframework.boot.actuate.health.CompositeHealthContributor

 

解决方法:原因是eureka依赖包的版本和我的spring-boot-starter-web冲突了,讲eureka版本降成2.1.2.RELEASE

 报错2:集成eureka报错 main] org.apache.catalina.core.ContainerBase : A child container failed duri

2023-05-20 10:39:31.626 ERROR 22292 --- [           main] org.apache.catalina.core.ContainerBase   : A child container failed during start

 解决方法:原因是jar包冲突,排除依赖的包servlet-api

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 

 

访问成功:

 

 

 

 

 

在provider配置注册中心

上面我们已经成功连接上了eureka的服务中心,下面我们需要在启动provider模块时使其自动注册进eureka的服务中心

1.导包:

      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
<!--        #监视器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

 

2.配置类

这里info要导入依赖spring-boot-starter-actuator才能使用

 

3.主启动类开启注解

 

 

测试访问:先启动eureka-7001,再启动provider-8001

成功拿到

 

 


Eureka的自我保护机制:

当某个服务断电了等原因不能用了,eruka不会立即清理数据,依旧会对微服务的信息进行保存

 

 

 扩展:在公司团队协作中:添加微服务列表清单

 测试结果:成功访问

 

 

Eureka集群配置

 

CAP原则:C一致性 A可用性 P容错性

 

 

zookeeper保证一致性和容错性

 eureka保证可用性和容错性

 因此 Eureka可以很好的应对网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使得整个注册服务瘫痪。

 

客户端负载均衡及Ribbon

 

 

 

 

 测试1.保证消费者模块成功注册到eureka注册中心

1.导入依赖包

 

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>springcloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>springcloud-consumer-dept-80</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

 

 

2.配置文件 application.yaml

 

server:
  port: 80
  #配置 ure
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7003.com:7003/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/

 

3.配置类添加注解开启Ribbon

 3.controller类请求

package com.lian.springcloud.controller;

import com.lian.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class DeptConsumerController {
    //消费层,不应该有service,消费者只和前端打交道
    //所以要调用方法,通过RestTemplate..供我们调用
    @Autowired
    private RestTemplate restTemplate;
    //通过ribbon实现,我们这里应该是一个变量
    private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-DEPT";
//    private static final String REST_URL_PREFIX="http://localhost:8080";
    @RequestMapping("/consumer/dept/add")
    //
    public Boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }
    ////通过id获取用户
    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id")int id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }

    //查询全部用户
    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }
}

4.主启动类开启euraka注解

  5.测试顺序:

开启eurka的三个注册中心,开启provider,开启consumer

报错1:

 

springcloud报错Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/internal/engine/DefaultClockProvider

原因是忘记在主启动类开启注解

 

报错2:

2023-05-20 14:29:39.083 ERROR 9264 --- [p-nio-80-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$MethodNotAllowed: 405 null] with root cause

 

org.springframework.web.client.HttpClientErrorException$MethodNotAllowed: 405 null

 原因是,我在前端访问的是http://localhost/consumer/dept/list,但是这个方法我在模块provider的dao底层用的是post请求,解决方法是把底层的post改成get

测试2:Ribbon轮循算法

Ribbon默认的是轮循算法,即假设我们有多个provider服务器,消费者通过80端口访问时候,根据轮循算法去访问一个provider服务器,如消费者相同的url请求,第一次访问到的是1号provider,消费者刷新一次页面,访问到的是2号provider,消费者再刷新一次页面,访问到的又是1号provider,如此循环即为轮循。轮询算法如果一个provider崩了,那么只会对其他provider进行轮循

实现步骤:

1.首先我们建了三个不同数据库,三个库都有一张dept表,这三张表只有字段db_source不同

 

2.接着我们创建了2号provider和3号provider,同时更改配置的yaml文件分别连接2号数据库和3号数据库,

 

启动测试:

启动eruka7001注册中心-->启动provider1号,2号,3号-->启动consumer模块-->访问“http://localhost/consumer/dept/get/1”

开始我并没有看到轮循效果,因为我的DeptMapper.xml文件中,把要查询的数据库定死了,如下把first删掉即可

 

 再刷新:可以看到现在是second数据库了

 

测试3:实现Ribbon自定义算法

负载均衡默认算法是轮循,但是我们可以自定义我们自己的算法,官方文档明确指出我们不应该在主启动类的同一个包下自定义ribbon算法,应该另开一个包

 

 步骤:

1.创建配置类LianRule,思想是实现接口IRule,记得注解

@Configuration
public class LianRule {
    @Bean
    public IRule myRule(){//我们要自定义自己的ribbon算法,只需要实现官方的IRule接口
        //LianRandomRule()对应官方的RandomRule()
        return new LianRandomRule();
    }
}

 

2.具体实现类LianRandomRule,

LianRandomRule()对应官方的RandomRule()
package com.lian.myrule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;


public class LianRandomRule extends AbstractLoadBalancerRule {

    /**
     * Randomly choose from all living servers
     */
//    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        Server server = null;

        while (server == null) {
            if (Thread.interrupted()) {
                return null;
            }
            List<Server> upList = lb.getReachableServers(); //活着的服务
            List<Server> allList = lb.getAllServers();

            int serverCount = allList.size();
            if (serverCount == 0) {
                /*
                 * No servers. End regardless of pass, because subsequent passes
                 * only get more restrictive.
                 */
                return null;
            }

            int index = chooseRandomInt(serverCount); //生成随机数
            server = upList.get(index);

            if (server == null) {
                /*
                 * The only time this should happen is if the server list were
                 * somehow trimmed. This is a transient condition. Retry after
                 * yielding.
                 */
                Thread.yield();
                continue;
            }

            if (server.isAlive()) {
                return (server);
            }

            // Shouldn't actually happen.. but must be transient or a bug.
            server = null;
            Thread.yield();
        }

        return server;
    }
    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }

    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
        // TODO Auto-generated method stub

    }
}

3.参考官方文档在主启动类添加注解

 4.启动测试:启动eruka7001注册中心-->启动provider1号,2号,3号-->启动consumer模块-->访问“http://localhost/consumer/dept/list”

不断刷新,随机连接不同的provider,使用的数据库随机变化

 Feign介绍:

feign是面向接口的编程架构,而前面的resttemplate是restful风格架构;OpenFeign 底层内置了 Ribbon 框架,因此Feign本质还是调用了Ribbon 负载均衡。

 

 

Feign原理

例子演示:我们靠Frign的方式,实现前端获取数据库用户记录 

步骤:

1.给springcloud-api导依赖

 

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>

 

 

 

开始的报错:

Caused by: java.io.FileNotFoundException: class path resource [org/springframework/boot/autoconfigure/web/ServerPropertiesAutoConfiguration.class] cannot be opened because it does not exist

原因是:导入的feign依赖和原本springboot的依赖版本冲突,换成下面这个就可以了

 

 2.在springcloud-api创建服务接口

 3.为了方便对比,新建一个consumer-dept-feign模块,给consumer-dept-feign模块导入依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>springcloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.lian</groupId>
    <artifactId>springcloud-consumer-dept-feign</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- http://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
<!--        替代ribbon-->
        <!-- http://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

 

4.controller类方法:

 4.主启动类

 

5.测试访问成功

 

 小总结:这几天学了:

eureka是注册中心,服务提供者和消费者都需要去注册中心注册,关于分布式系统的CAP理论告诉我们:一个分布式系统只能同时满足其中两个。eurka保证的是AP,就是可用性和容错性,我们可以有多个注册中心,防止单个注册中心崩溃;我们可以搭建集群,多个注册中心,多个provider提供者,但是消费者只能一个;

erueka还有自我保护机制,这个机制使得加入有某个服务器断电或者故障了,eureka还是能够保留原来的数据不丢失。

Ribbon和负载均衡,我们通过Ribbon将用户的访问交给到不同的provider处理,类似于分流,防止服务器压力过大,Ribbon本身默认的是轮循算法,我们可以通过实现接口IRule来自定义我们的算法,但是需要注意的是官网提到了不能把自定义的轮循算法放在和主启动类同一个包下,因此我们需要自己建一个包编写我们自定义算法同时把它注册到spring容器里

Feign:开发人员习惯面向接口编程而来,是为了我们在消费者的controller更方便调用,而不使用RestTemplate模板类,实现过程:导包(注意版本)我们需要在api内定义服务接口,同时在接口上开启注解@FeignClient,在消费者模块也要导入feign依赖包,编写更简便的controller方法然后在主启动类开启支持feign注解

服务熔断:服务器之间,依赖包之间等可能存在相互调用的关系,即provider1需要调用provider2,provider2需要调用provider3,当provider2出现故障后,任务无法正常进行,后面用户的请求全部阻塞在了provider1,同时容易级联其他的问题,在高并发情况下非常容易导致整个系统雪崩,因此我们通过Hystrix技术栈有效处理服务熔断的情况。

服务降级:有时候单个服务器收到非常非常多用户的访问,而另些服务器基本无人问津,那么我们就关闭这些无人问津的服务器,把更多资源分配给火爆的服务器,来降低受很多人访问的服务器的压力,我们需要在springcloud-api的service目录写降级类实现接口FallbackFactory,我使用的是feign进行的测试,所以在我原本写的接口DeptClientService需要通过注解绑定降级类,测试:开启eruaka7001->开启provider8001->开启 FeignDeptConsumer_80  当我们关闭provider8001查看页面是否有打印出提示信息。

 

本文转载于网络 如有侵权请联系删除

相关文章

  • JMeter扩展Java请求实现WebRTC本地音视频推流压测脚本

    WebRTC是WebReal-TimeCommunication缩写,指网页即时通讯,是一个支持Web浏览器进行实时语音或视频对话的API,实现了基于网页的视频会议,比如声网的AgoraWebSDK就是基于WebRTC实现音视频通信的。与HTTP不同,WebRTC应用的主要压力是码流,JMeter没有找到提供WebRTCSampler的第三方jar包,只能自己尝试写一个。无头浏览器正常情况是打开浏览器,打开摄像头和麦克风输入音视频流进行请求传输,测试模拟采用无头浏览器,读取本地文件作为音视频输入。无头浏览器是指没有界面的浏览器,通过调用浏览器API来模拟操作,比如Chrome在启动时添加--headless,就可以进入无头模式。 WebRTC是使用JavaScript编写的,在前端领域生态相对来说丰富一些,有现成可用的Node库Puppeteer来支持无头浏览器:为了让JMeter能并发调用,需要编写Java代码调用Puppeteer,听着有点想象力,实际上已经有封装好的开源库了:jvppeteer。Java代码在pom.xml中添加依赖:<dependency> <

  • 深度残差收缩网络详解

    深度残差网络ResNet获得了2016年IEEEConferenceonComputerVisionandPatternRecognition的最佳论文奖,目前在谷歌学术的引用量已高达38295次。深度残差收缩网络是深度残差网络的一种的改进版本,其实是深度残差网络、注意力机制和软阈值函数的集成。在一定程度上,深度残差收缩网络的工作原理,可以理解为:通过注意力机制注意到不重要的特征,通过软阈值函数将它们置为零;或者说,通过注意力机制注意到重要的特征,将它们保留下来,从而加强深度神经网络从含噪声信号中提取有用特征的能力。1.为什么要提出深度残差收缩网络呢?首先,在对样本进行分类的时候,样本中不可避免地会有一些噪声,就像高斯噪声、粉色噪声、拉普拉斯噪声等。更广义地讲,样本中很可能包含着与当前分类任务无关的信息,这些信息也可以理解为噪声。这些噪声可能会对分类效果产生不利的影响。(软阈值化是许多信号降噪算法中的一个关键步骤)举例来说,在马路边聊天的时候,聊天的声音里就可能会混杂车辆的鸣笛声、车轮声等等。当对这些声音信号进行语音识别的时候,识别效果不可避免地会受到鸣笛声、车轮声的影响。从深度学习的

  • MySQL 每秒 570000 的写入,如何实现?

    一、需求一个朋友接到一个需求,从大数据平台收到一个数据写入在20亿+,需要快速地加载到MySQL中,供第二天业务展示使用。二、实现再分析对于单表20亿,在MySQL运维,说真的这块目前涉及得比较少,也基本没什么经验,但对于InnoDB单表Insert如果内存大于数据情况下,可以维持在10万-15万行写入。但很多时间我们接受的项目还是数据超过内存的。这里使用XeLabsTokuDB做一个测试。三、XeLabsTokuDB介绍项目地址: https://github.com/XeLabs/tokudb相对官方TokuDB的优化:内置了jemalloc内存分配 引入更多的内置的TokuDB性能指标 支持Xtrabackup备份 引入ZSTD压缩算法 支持TokuDB的binlog_group_commit特性四、测试表TokuDB核心配置:loose_tokudb_cache_size=4G loose_tokudb_directio=ON loose_tokudb_fsync_log_period=1000 tokudb_commit_sync=0 表结构:CREATETABLE`user

  • 玩了一下websocket 原

    nginx配置location/wsapp/{ proxy_passhttp://0.0.0.0:9501; proxy_http_version1.1; proxy_set_headerUpgrade$http_upgrade; proxy_set_headerConnection"Upgrade"; }复制后端代码<?php $server=newswoole_websocket_server("0.0.0.0",9501); $server->on('open',function(swoole_websocket_server$server,$request){ echo"server:handshakesuccesswithfd{$request->fd}\n"; }); $server->on('message',function(swoole_websocket_server$server,$frame){ echo"receivefro

  • 云计算的可迁移性为什么很难完美实现

    导语可迁移性意味着企业可以将应用程序从一个主机环境迁移到另一个,其包括云平台之间的迁移。容器是一种将应用程序和操作系统封装到可以在支持Docker或Kubernetes等容器标准平台上运行的软件包的一种技术,从而使其迁移变得更加简单。但容器并不是灵丹妙药。许多云计算提供商都在谈论业务的可迁移性,这意味着需要使用诸如容器之类的技术,不过要是真那么简单就好了。 可迁移性意味着企业可以将应用程序从一个主机环境迁移到另一个,其包括云平台之间的迁移。例如从AmazonWebServices到MicrosoftAzure。而将应用程序从一个平台迁移到另一个平台所需的工作取决于具体情况。容器是一种将应用程序和操作系统封装到可以在支持Docker或Kubernetes等容器标准平台上运行的软件包的一种技术,从而使其迁移变得更加简单。但容器并不是灵丹妙药。实际情况是,迁移应用程序(无论它们是否在容器中)都需要大量的计划来处理不同环境的兼容性问题。容器的使用并不能保证企业的容器化应用程序都可以从一个平台迁移到另一个平台。例如,企业不能采用一个专门用于Linux的容器化应用程序在Windows上运行,或者反

  • 深入.NET框架

    1.1.NET框架的优点  面向对象  对Web应用的强大支持  对WebService(Web服务)的支持  实现SOA,支持云计算  支持构建.NET程序的炫彩外衣二: .NET框架结构  1.NET运行在操作系统之上,是.NET最基础的框架。他提供了创建,部署和运行.NET应用的环境,主要包括公共语言运行时(CLR)和  框架类库(.NETFrameWork类库(FCL)),并且支持多种开发语言。例如:(C#,VB,.NET,C++)等。   2..NET最主要的两个组件:CLR和FCL。CLR是.NET框架的基础。FCL是一个中和性的面向对象的可重用的类型集合。   3.CLR的全称为公共语言运行时(CommonLanguageRuntime),它是所有.NET应用程序的环境.是说有.NET应用程序都要使用的编程基础  它如同一个支持.NET应用程序运行和开发的虚拟机,它包含两个组成部分:CLS(公共语言规范)和CTS(通用类型系统) 4.FCL是.NET框架的另一个重要组成部分,即框架类库FCL提供了对系统功能的调用,是建立.NET应用程序,组件和控件的基础。  类库:物理文

  • 【自然框架】之通用权限(二):人员表组

          继续,这是第二章了。本来想在这一章里面介绍三个表组来着,但是我有点写不好的感觉,还是多分几章吧,这一章就只介绍人员表组。第二章到第五章主要是介绍表结构。我是习惯使用Excel来设计表,一开始的时候只能记录表名、字段名、字段类型、字段说明等信息,但是一直没能找到如何使用Excel来体现出来表之间的关系。前一阵子(好像是去年)突然想到了可以使用“图表”+图形(比如箭头)的方式来做表关系,第一章里的那几个图就是这么弄出来的,看着还凑合吧。       至于为什么不用PowerDesigner来做,个人习惯问题吧。Excel的特点是,可以很清晰的看到字段的信息,因为往往字段比表关联还要重要,所以我还是习惯使用Excel。现在更是离不开了。我现在可以做到依据这个Excel里面的记录来生成表(在SQLServer里面建立表),生成配置信息。而当需求有变化的时候,我也能做到Excel数据库文档、数据库、配置信息三者的同步更新。这个同步更新并不是手动去修改,而是通过一个“项目、配置信息管理程序”来实现的,而这个“程序”也是自然框架的一部分,有一点IDE的苗头。呵呵。(一说“通用”我就想起了

  • ASP.NET MVC的SNS软件Spacebuilder

    SpacebuilderV4.0展示了全新构建的微博、贴吧、群组、日志、问答、相册、积分商城等社区功能,Spacebuilder开发团队却在V4.0正式版发布之际,突然给大家带来了一份大礼!——“Spacebuilder从此走向开源!”,Spacebuilder从v4.0开始步入开源之路,平台代码开放了90%。Spacebuilder步入开源之路文章提到官方开源的原因:Spacebuilder是拓宇专注6年发展的产品,日益暴露出一些影响产品快速发展的问题:知名度没有达到预期、难以形成以Spacebuilder为平台囊括第三方应用/插件/皮肤的生态系统,开放源代码将有助于解决这些问题。1.开源以后可以让更多的人,了解并使用到Spacebuilder,一个产品一旦使用的人多了发展就会更加迅速起来,这样对用户或开发团队都是很有意义的事。2.开源后第三方开发人员可以对Spacebuilder进行二次开发,开发出来以后的功能,还能够自己使用或出售给使用者,而Spacebuilder本身的“平台+应用”设计思路正好就与第三方开发者形成了,共生共赢的关系。3.当开源触发的Spacebuilder平台

  • 腾讯云智能创作参数类型调用方式

    目前腾讯云API3.0输入参数和输出参数支持如下几种数据格式: String:字符串。 Integer:整型,上限为无符号64位整数。SDK3.0不同编程语言支持的类型有所差异,建议以所使用编程语言的最大整型定义,例如Golang的uint64。 Boolean:布尔型。 Float:浮点型。 Double:双精度浮点型。 Date:字符串,日期格式。例如:2022-01-01。 Timestamp:字符串,时间格式。例如:2022-01-0100:00:00。 TimestampISO8601:ISO8601是由国际标准化组织(InternationalOrganizationforStandardization,ISO)发布的关于日期和时间格式的国际标准,对应国标《GB/T7408-2005数据元和交换格式信息交换日期和时间表示法》。建议以所使用编程语言的标准库进行格式解析。例如:2022-01-01T00:00:00+08:00。 Binary:二进制内容,需要以特定协议请求和解析。

  • C#调用C++ DLL动态库的两种方式

    第一种方式:C++导出函数, c#dllimport 的方式 在很多地方都看到过,如[dllimport“user32.dll”]这种代码,调用windowsAPI,就是通过这种方式实现。 例子:新建C++项目,创建动态链接库(DLL),然后添加头文件textdll.h #pragmaonce #ifdefA_EXPORTS #defineDLL_API__declspec(dllexport) #else #defineDLL_API__declspec(dllimport) #endif extern"C"DLL_APIvoidMessageBoxShow();//通过extern“C”使MessageBoxShow方法为一个导出方法,外部可见复制 然后,dllmain.cpp中添加代码: #include"stdafx.h" #include"textdll.h" BOOLAPIENTRYDllMain(HMODULEhModule, DWORDul_reason_for_call, LPVOIDlpReserved ) { switch(ul_rea

  • location 浅解析

    https://www.baidu.com/s?ie=UTF-8&wd=sdasds location.href//'https://www.baidu.com/s?ie=UTF-8&wd=sdasds' location.protocol//'https:' location.host//'www.baidu.com' location.port//'' location.pathname//'/s' location.search//'?ie=UTF-8&wd=sdasds' location.hash//''

  • PVE

    ProxmoxVE是一个运行虚拟机器和容器的平台。它基于Debian·linux,并完全开源。为了获得最大的灵活性,我们实现了两种虚拟化技术-基于内核的虚拟机器(KVM)和基于容器的虚拟化(LXC)。 一个主要的设计目标是使管理尽可能容易。您可以在单个节点上使用ProxmoxVE,或组装多个节点的集群。所有管理任务都可以使用我们的基于Web的管理界面完成,即使是新手用户也可以在几分钟内设置和安装ProxmoxVE。 1.1.中央管理 虽然许多人从单个节点开始,但ProxmoxVE可以扩展到一组大型聚类节点。集群堆栈已完全集成,并带有默认安装的船舶。 独特的多主设计 集成的基于Web的管理界面可让您全面了解所有KVM客人和Linux容器,甚至整个集群。您可以轻松地从GUI管理您的VM和容器、存储或聚类。无需安装独立、复杂且昂贵的管理服务器。 普罗克斯莫克斯集群文件系统(pmxcfs) ProxmoxVE使用独特的Proxmox聚类文件系统(pmxcfs),这是一个数据库驱动的文件系统,用于存储配置文件。这使您能够存储数千台虚拟计算机的配置。通过使用corosync,这些

  • 2022-3-15内部群每日三题-清辉PMP

    1.一家公司被一家大公司收购,这家大公司希望把重点放在其核心产品和服务上。处于规划阶段的所有项目都正在进行修定,以包含新的变更管理程序。一个项目的项目经理需要持续的高级输入,以确保与新的组织结构保持一致。若要确保项目变更得到有效管理,项目经理应该怎么做? A.重新开放需求,扩展项目以包含新的变更管理程序,并指定一名团队成员全权负责变更管理 B.确定哪些变更控制适用于该项目,只实施那些相关且有价值的变更控制,并在必要时将变更升级上报给管理层 C.忽略新的变更管理过程,并通知新的管理层,项目需求已经完成并且无法进行变更 D.实施新的变更控制并形成变更控制委员会(CCB),以跟踪和监控变更,并及时解决问题和升级上报问题 2.在项目启动大会结束时,项目经理重述项目范围并让关键相关方和高管提出意见,项目经理正在尝试完成什么目标? A.记录需求日志的信息 B.设定团队成员对项目可交付成果的期望 C.获得相关方的正式承诺 D.创建项目的范围基准 3.在组织企业资源规划(ERP)系统中实施税务相关变更的一个项目正在进行中。在验收测试期间,财务组用户担心发票没有数字签名,财务组的主管坚持认为这种情况必须

  • Java深度历险(五)——Java泛型

      作者 成富 发布于2011年3月3日 | 注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情!17 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单   Java泛型(generics)是JDK5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(typeparameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK5中的新集合类框架中。对于泛型概念的引入,开发社区的观点是褒贬不一。从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误。而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的地方。当然这也是任何有历史的编程语言所需要承担的历史包袱。后续的版本更新会为早期的设计缺陷所累。   开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法

  • 高并发处理

    了解一点高并发性问题,比如一W人抢一张票时,如何保证票在没买走的情况下所有人都能看见这张票,显然是不能用同步机制,因为synchronize是锁同步一次只能一个人进行。这时候可以用到锁机制,采用乐观锁可以解决这个问题。乐观锁的简单意思是在不锁定表的情况下,利用业务的控制来解决并发问题,这样即保证数据的可读性,又保证保存数据的排他性,保证性能的同时解决了并发带来的脏读数据问题。

  • Halcon一日一练:图像特征

    1:图像编辑过程中产生的图像    在某些场合,我们需要对图像局部进行提取,其余部分图则进行屏蔽,此时能够对图像进行编辑操作,reduce——domain函数典型的操作方式就可以做到这点,对原始图像通过一个区域进行分割,这种操作能够实现对应区域的图像采集,而舍弃其余的内容。    这种操作在图像处理过程中称之为感兴趣区域(ROI),我们需要的图像通过区域的方式分割处理,最终获取我们所需要的图像部分信息。 例程: dev_set_draw('margin') read_image(Image,'plit2.png') get_image_size(Image,Width,Height) gen_ellipse(Ellipse,Height/2,Width/2,0,300,180) reduce_domain(Image,Ellipse,ImageReduced) dev_clear_window() dev_display(ImageReduce)复制 图一:原始图像 生成椭圆 生成AOI   2:Halco

  • html5语义化标签

    语义化标签:语义化的主要目的就是让大家直观的认识标签(markup)和属性(attribute)的用途和作用;好处:最主要的就是对搜索引擎友好,有了良好的结构和语义使得网页内容自然容易被搜索引擎抓取,便于网站的推广。 <header>页眉:主要用于页面头部的信息介绍,也可以用于板块头部。 <hgroup>标题组合:标题和子标题或者是标语的组合。 1<hgroup> 2<h1>这是大标题</h1> 3<h2>这是子标题</h2> 4</hgroup>复制   <nav>导航:包含一个链接的列表。 <footer>页脚:页面的底部或者是版面的底部。 <section>板块:页面上的板块用于划分页面上的不同区域,或者是划分文章里的不同章节。 <article>用来在页面中表示一套结构完整且独立的部分内容。 <aside>元素标签可以包含与当前页面或主要内容相关的引用、侧边栏、广告、nav元素组、以及

  • C++学习(30)

    1//设计一个数据元素为int类型的顺序堆栈类 2//要求:入栈操作异常时,异常处理模块中输出当前要入栈的数据元素值,并设计一个测试程序 3#include<iostream.h> 4 5classPushOnFull{ 6private: 7intvalue; 8public: 9PushOnFull(intx){ 10value=x; 11} 12intValue(){ 13returnvalue; 14} 15}; 16 17classPopOnEmpty{ 18}; 19 20classSeqStack{ 21private: 22int*data; 23intMaxStackSize; 24inttop; 25public: 26SeqStack(intn); 27~SeqStack(); 28 29voidPush(constintitem); 30intPop(); 31}; 32 33SeqStack::SeqStack(intn){ 34top=0; 35MaxStackSize=n; 36data=newint[n]; 37} 38 39SeqStack

  • 线性代数学习笔记(二)

    高斯消元法解线性方程 对于Ax=b: fori:=1ton-1: forj:=i+1ton: ifa(i,j)==0: substituterowjwithsomerowbelowj rowj:=rowj-rowi*a(j,i)/a(i,i) 复制 结合矩阵相乘的rowpicture来看,高斯消元每一步均可看做是一个矩阵E乘以A,例如: \(E_{i,j}A=\begin{bmatrix}1&0&0\\1&1&0\\0&0&1\end{bmatrix}\begin{bmatrix}\mathbf{a_1}\\\mathbf{a_2}\\\mathbf{a_3}\end{bmatrix}=\begin{bmatrix}\mathbf{a_1}\\\mathbf{a_1+a_2}\\\mathbf{a_3}\end{bmatrix} \) Eij乘以A得到EA的意义是:第一行结果不变,第二行结果是原第一行加上原第二行,第三行结果不变。将所有Eij相乘(包括逆向迭代的过程),得到的结果就是A的逆矩阵(1.如果有逆的话;2.不考虑行

  • 一套完整的测试应该由哪些阶段组成?

    一套完整的测试应该由哪些阶段组成?可行性分析、需求分析、概要设计、详细设计、编码、单元测试、集成测试、系统测试、验收测试

  • 爬虫基础——request模块和BeautifulSoup模块

    文章来自这里   request Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的API太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。 Requests是使用Apache2Licensed许可证的基于Python开发的HTTP库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。 1、GET请求 #1、无参数实例 importrequests ret=requests.get('https://github.com/timeline.json') printret.url printret.text #2、有参数实例 importrequests payload={'key1':'value1','key2':'value2'} ret=requests.get("http://httpbin.org/get",

相关推荐

推荐阅读