第二章 使用SpringCloud框架实现一个微服务

DDD学习笔记 - 实战篇(Ⅱ) 14 | 代码模型(下):如何保证领域模型与代码模型的一致性? 课程链接:https://time.geekbang.org/column/article/166147 DDD 强调先构建领域模型然后设计微服务,以保证领域模型和微服务的一体性,因此不能脱离领域模型来谈微服务的设计和落地。但在构建领域模型时,往往是站在业务视角的,并且有些领域对象还带着业务语言。还需要将领域模型作为微... 阅读详情
1.项目概要介绍
在这一章节中,我们尝试通过一个可以运行的简单的示例来学习SpringCloud的功能,在案例的选择上,我们也是从项目实际出发,选取了一个消息服务(Message-Service),因为实际的项目中都可能会用到通过短信网关或者Email发送一些通知消息的功能,我们编写的示例代码也是尽可能的接近于真实的生产代码,在后续的章节中,我们会随着学习的深入,对此示例进行不同程度的改写和重构,以满足大型分布式企业使用需求。
2.项目所涉及到的技术或工具
核心技术选型:
  • JDK1.8
  • Maven 3.5.2
  • spring-boot-starter-parent 1.5.8
  • spring-cloud-dependencies Dalston.SR4
  • lombok 1.16.18
3.项目架构
系统分层架构:

该演示系统遵循典型的三层架构模式,Controller层提供Rest服务,业务逻辑层放在Service层实现,Controller层与Service层通过接口进行调用依赖,DAO层负责数据库的读写操作,DB是该微服务所涉及到的数据库表信息。
4.项目创建
使用Eclipse的Maven工程创建向导创建一个maven单模块项目,这里我们命名为springcloud-message,你也可以根据自己的喜好,选择自己熟练的IDE来创建工程,创建好项目的基本信息如下
group:com.pachiraframework
artifact-id:springcloud-message
version:0.0.1-SNAPSHOT
packing:jar
如图所示:

5.添加SpringBoot相关依赖
使用springboot的一个优势就是它为我们提供了非常多的starter组件,用来简化我们的开发,一旦使用它以后,你会发现以后的开发越来越离不开它--因为它实在是太方便了。
  • 给该工程pom设置一个parent依赖spring-boot-starter-parent


如果你点开这个parentpom你会发现里面定义了很多常用的插件,还有一堆jar包及其版本,只不过这些jar包都是声明式的,只是做了声明,并没有真实的引入到工程中,这样你在自己的pom文件中就不需要写依赖jar包的版本了,就像在这个截图中展示的,我们把工程的parent指向spring-boot-starter-parent后,junit的依赖上出现了一个黄色警告信息,告诉我们这个版本号已经在父类中声明过了,在项目中就没必要声明版本号了。
  • 引入spring-boot-starter-web
加入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

  • 引入freemarker
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在工程中我们将采用freemarker模版技术来为短信模版处理变量替换

6.核心代码编写
按照系统架构分层创建对应的工程包结构出来

其中
  • controller 包中包含是的对应的rest服务接口
  • dao中包含数据库操作
  • dto 包含参数传递所需的变量,如入参对象或返回值对象
  • entity包含数据库表模型对象
  • service 定义了服务层的接口
  • service.impl 是service接口层的实现,会调用dao组件完成业务操作

在这例子中,我们将短信内容以模版的方式存储在数据库表中,在发送短信时,请求对象需要携带要使用模版的ID和参数,然后替换模版中的变量,最终得到要发送的短信的内容。
核心对象:
  • SmsSendRequest 客户端发送短信所需参数的封装, 如短信模版ID,模版参数列表,要发送给哪个手机号
  • SmsSendResponse 发送短信的结果,如发送后短信网关的返回值code,消息提示等
  • MessageTemplate是一个entity实体,表示一个短信模版,由一个唯一短信模版ID,模版内容组成,当然可以根据实际需要添加诸如短信签名,模版分类(通知类、广告营销)等
MessageTemplate的代码如下:
package com.pachiraframework.springcloud.message.entity;

import lombok.Data;

@Data
public class MessageTemplate {
/**
* 模版ID
*/
private String id;
/**
* 模版名称
*/
private String name;
/**
* 模版内容
*/
private String content;
}

SmsSendRequest对象的代码如下:
package com.pachiraframework.springcloud.message.dto;

import java.util.Map;

import lombok.Data;

/**
* 发送sms消息对象
* @author wangxuzheng
*
*/
@Data
public class SmsSendRequest {
/**
* 短信模版ID
*/
private String templateId;
/**
* 要发送的手机号
*/
private String mobile;
/**
* 模版中携带的参数信息
*/
private Map<String, Object> params;
}

SmsSendResponse代码如下:
package com.pachiraframework.springcloud.message.dto;

import lombok.Data;

@Data
public class SmsSendResponse {
/**
* 返回消息
*/
private String message;
/**
* 返回状态码
*/
private String code;
}
DAO中的方法很简单,为了演示,模拟了一个从数据库中根据模版ID获取模版信息的例子,这个例子中我们的短信模版中有个${code}变量,表示要从客户端程序中传递过来的真实的数据。
package com.pachiraframework.springcloud.message.dao;

import org.springframework.stereotype.Repository;

import com.pachiraframework.springcloud.message.entity.MessageTemplate;

@Repository
public class MessageTemplateDao {
public MessageTemplate get(String id) {
//改成从数据库中读取模版信息
MessageTemplate template = new MessageTemplate();
template.setId(id);
template.setName("注册验证码通知短信");
template.setContent("验证码${code},请在页面输入此验证码并完成手机验证。XXX公司");
return template;
}
}
SmsServiceImpl中实现发送短信的逻辑,这里我们并没有调用实际的短信网关,需要根据项目的真实情况,调用对应的短信服务,将doSend()方法中改成调用短信服务即可。
package com.pachiraframework.springcloud.message.service.impl;

import java.io.StringReader;
import java.io.StringWriter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pachiraframework.springcloud.message.dao.MessageTemplateDao;
import com.pachiraframework.springcloud.message.dto.SmsSendRequest;
import com.pachiraframework.springcloud.message.dto.SmsSendResponse;
import com.pachiraframework.springcloud.message.entity.MessageTemplate;
import com.pachiraframework.springcloud.message.service.SmsService;

import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class SmsServiceImpl implements SmsService {
@Autowired
private MessageTemplateDao messageTemplateDao;
@Autowired
private Configuration configuration;
@Override
@SneakyThrows
public SmsSendResponse send(SmsSendRequest request) {
MessageTemplate messageTemplate = messageTemplateDao.get(request.getTemplateId());//根据模版ID从数据库中加载模版明细
String templateContent = messageTemplate.getContent();
Template template = new Template(request.getTemplateId(), new StringReader(templateContent), configuration);
StringWriter out = new StringWriter();
template.process(request.getParams(), out);//模版内容+传递进来的参数=最终要发送的短信内容
String content = out.toString();
return doSend(request.getMobile(), content);//调用实际的短信网关服务,发送短信
}
//改成调用实际的短息网关发送消息
private SmsSendResponse doSend(String mobile,String content) {
SmsSendResponse response = new SmsSendResponse();
response.setCode("200");
response.setMessage("发送成功");
log.info("发送完毕,手机号:{},发送内容:{},状态码:{}",mobile,content,response.getCode());
return response;
}
}
Rest服务,这里我们使用了2中方式来提供服务,实际生产环境中,根据需要只选择一种即可,只因为这两种服务提供方式不同,对应的客户端调用也是不一样的
package com.pachiraframework.springcloud.message.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.pachiraframework.springcloud.message.dto.SmsSendRequest;
import com.pachiraframework.springcloud.message.dto.SmsSendResponse;
import com.pachiraframework.springcloud.message.service.SmsService;

@RestController
@RequestMapping("/message/sms/")
public class SmsController {
@Autowired
private SmsService smsService;
@RequestMapping(method=RequestMethod.POST,value="send")
public ResponseEntity<SmsSendResponse> send(SmsSendRequest request){
SmsSendResponse response = smsService.send(request);
return ResponseEntity.ok(response);
}
@RequestMapping(method=RequestMethod.POST,value="send2")
public ResponseEntity<SmsSendResponse> send2( @RequestBody SmsSendRequest request){
SmsSendResponse response = smsService.send(request);
return ResponseEntity.ok(response);
}
}

通过一个main函数将服务启动起来
package com.pachiraframework.springcloud.message;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MessageApplication {
public static void main(String[] args) {
SpringApplication.run(MessageApplication.class, args);
}
}
7.启动服务
运行步骤6中的MessageApplication中的main函数,将服务启动起来,通过后台的log我们可以看出,实际上SpringBoot框架给我们启动了一个内嵌的tomcat容器,并监听8080端口(可以通过配置文件修改),启动成功,则会出现如下图所示的一些信息

8.通过Postman工具测试rest服务
1)测试send方法
根据我们Rest接口的url和参数,在Postman中按照如下内容进行设置
请求方法:POST
参数列表:--由于我们在send方法中接收的是SmsSendRequest对象,根据SpringMVC参数绑定的规则,我们需要根据SmsSendRequest中的属性进行参数传递即可
templateId: CHECK_CODE --当然这个案例中你传递任意的字符都是可以的,因为我们在MessageTemplateDao中并没有真实的去查询数据库:)
mobile:18562875992 --要发送的手机号地址
params['code']:123456 这个参数比较有趣,因为在SmsSendRequest对象中我们把模版要传递的参数定义成了一个Map<String,Object>类型,因此这种传递表示要往params属性的key=‘code’传递value=123456,即params.set("code","123456"),如果模板中含有多个参数,可以通过这种方式传递多个key-value的组合

2)测试send2方法
请求方法:POST
请求URL: http://localhost:8080/message/sms/send2
参数列表:send2方法在接收参数时使用的是@RequestBody注解,它接收的是一个json串,然后把接收到的json串绑定到参数对象上,因此这种方法和上面的不同
首先要设置请求内容类型是application/json

然后设置post内容,注意设置类型是raw

点击发送,得到的结果和上个一样的
9.通过RestTemplate调用Rest服务
针对2中不同方式的rest方法,使用RestTemplate调用的方式也是不一样的,如下代码所示
第一种方式需要逐个填写参数名称和对应的参数值;第二种方法更间接,直接把SmsSendRequest对象封装好,然后发送请求即可
package com.pachiraframework.springcloud.message.controller;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import com.pachiraframework.springcloud.message.dto.SmsSendRequest;
import com.pachiraframework.springcloud.message.dto.SmsSendResponse;

public class SmsControllerTest {
private static final String SEND_URL = "http://localhost:8080/message/sms/send";
private static final String SEND2_URL = "http://localhost:8080/message/sms/send2";
private RestTemplate restTemplate = new RestTemplate();
@Test
public void testSend() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("mobile", "18562875992");
map.add("templateId", "CHECK_CODE");
map.add("params['code']", "123456");

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<SmsSendResponse> response = restTemplate.postForEntity(SEND_URL, request, SmsSendResponse.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
assertThat(response.getBody(), notNullValue());
SmsSendResponse sendResponse = response.getBody();
assertThat(sendResponse.getCode(), equalTo("200"));
assertThat(sendResponse.getMessage(), equalTo("发送成功"));
}
//这种方式客户端直接传递SmsSendRequest参数,RestTemplate内部会将其转换成json传传输
@Test
public void testSend2() {
SmsSendRequest request = new SmsSendRequest();
request.setMobile("18562875992");
request.setTemplateId("CHECK_CODE");
Map<String, Object> params = new HashMap<String, Object>();
params.put("code", "123456");
request.setParams(params);
ResponseEntity<SmsSendResponse> response = restTemplate.postForEntity(SEND2_URL, request, SmsSendResponse.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
assertThat(response.getBody(), notNullValue());
SmsSendResponse sendResponse = response.getBody();
assertThat(sendResponse.getCode(), equalTo("200"));
assertThat(sendResponse.getMessage(), equalTo("发送成功"));
}

}
执行测试用例

源码地址:

附:工程搭建过程中的常见问题及解决办法
  • 使用eclipse向导创建工程后,工程的默认jdk是1.6
如下图所示,系统中已经没有jdk1.6的版本了,但是自动创建的工程仍然标识为1.6

由于使用了最新的springcloud组件,必须在jdk1.8或以上版本上运行,因此需要做出改变。
修改settings.xml文件,添加一个jdk-1.8的profile,并启用它

做完这些修改后,重新创建工程,可以看到新建的工程已经使用jdk1.8了,如图

SpringCloud溯源——从单体架构到微服务Microservices架构 &amp; 分布式和微服务 &amp; 为啥要用微服务_springcloud单体项目转微服务 1.分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已,而实际上这些服务是通过背后的众多服务器组成的一个分布式系统,因此分布式系统看起来像是一个超级计算机一样。 阅读详情

相关推荐

SpringCloud微服务入门:使用idea搭建第一个微服务项目

(一)什么是微服务? 在了解什么是SpringCloud之前,我们有必要去了解一下什么是微服务。在传统的项目中,我们都是把所有的代码都放在一个单体应用中,这种方式配置方便,可以很好的运行部署,但是随着项目越来越大,这个单体应用就会越来越臃肿,再加上一个项目中融合了许多人不同的代码,可维护性越来越低。以至于现在一些企业的项目中所用到的代码还是很早期的框架和代码风格。这个时候,一种叫做微服务的架构方式出现了。 有人对微服务做了这样一个定义:“微服务架构是一种将单个应用程序开发为一组小服务的方法,每个小服务都

weixin_45863786的博客 4652

一、SpringCloud微服务案例-API公共模块和部门Entity步骤

请看上一章架构讲解: 整体父工程Project 1.新建父工程microservicecloud,切记Packaging是pom模式 主要是定义POM文件,将后续各个子模块公用的jar包等统一起来microservicecloud(root)根目录的pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi...

ok3356的博客 3830

基于 springcloud 框架的商品管理微服务

使用注册中心Eureka、Hystrix容错、路由网关、配置中心 商品的增删改查,其中查需要有按照商品ID、厂家ID、价格等查询,可实现多条件查询,实现商品相关其他微服务,如:订单管理,用户信息获取

m0_54300742的博客 1961

【技术杂谈】springcloud微服务之数据操作独立模块化

前言 相对于 spring 对 mybatis 以及 redis 等的整合所需要的各种配置文件,在 springboot 下,已经大大的简化了,你可能只是需要增加个依赖,加个注解,然后在配置文件中添加一些属性,就已经集成完成了。真正的体现了springboot的“约定大于配置”。 问题 但是,在实际的开发中,还是遇到了一些问题,比如我有一...

weixin_33774883的博客 753

SpringCloud微服务框架搭建指南

本文档将指导您如何从零开始搭建一个SpringCloud微服务框架,并实现一个包含服务注册、服务发现、配置中心、API网关和多个业务服务的完整微服务示例。

weixin_51040479的博客 1154

vscode运行.ipynb代码时提示需要安装ipykernel包的解决办法

此文目的是为了记录遇到的一些问题,也希望能帮助到和我一样遇到困难的同学。如需转载,请注明出处。在使用vscode运行.ipynb文件中提示需要安装ipykernel包的提示,在网上查询了很多方法之后也是终于解决了问题。写下这篇博客也希望能帮到大家。

qq_58018041的博客 4万+

SpringCloud 远程消费( Feign 远程调用&& DTO 层的构建)

前言:继上一篇博客的基础上在进行的编码 SpringCloud 的基本使用 nacos SpringCloud 基本使用与 nacos_m0_58525944的博客-优快云博客 一,Feign 远程调用消费者(consumer)生产者(provider) 1,定义远程调用接口 在生产者 建立pojo软件包,新建User实体类 package com.provider.nacos_provider.pojo; import lombok.AllArgsConstructor; ...

m0_58525944的博客 1748

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装)

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装) 写在前面 事先说明,本人不是大佬,我只是在不断探索的途中找到了解决这个问题的方法,之前在网上搜索的时候没有看到相关文章,所以就来简单讲一下。 正文 借着蚂蚁金服小程序大赛开通了支付宝小程序个人开发者,尝试将一个微信小程序的项目移植到支付宝上,支付宝对于用户唯一id的获取比微信要复杂很多,微信...

weixin_43102379的博客 3642

中央服务系统中负责首页数据展示 通过feign多模块调用

中央服务数据聚合枢纽建设背景在分布式架构体系下,首页数据聚合服务作为企业级管理系统的重要门户,承担着多业务线数据整合与可视化呈现的核心职责。模块基于 Spring Cloud 生态构建,采用微服务化设计理念,通过标准化接口规范打通门票、酒店、度假等五大业务模块,实现跨系统数据的高效聚合。服务解耦:通过 Feign 客户端实现跨模块通信,保障业务独立性数据规范:建立统一的 DTO/VO 转换体系,确保数据输出一致性容错保障:采用熔断降级机制,单模块故障不影响全局服务。

shaozheng0503的博客 1479

SAP ABAP BADI_FINS_ACDOC_POSTING_EVENTS 深度应用:KO88工单结算的凭证字段定制与财务数据增强

本文深入探讨了SAP ABAP中BADI_FINS_ACDOC_POSTING_EVENTS在KO88工单结算中的应用,详细解析了如何通过BADI实现财务凭证字段的定制与数据增强。文章提供了从结构扩展到BADI方法实现的完整步骤,包括性能优化建议和实际应用中的测试验证流程,帮助开发人员高效解决企业个性化财务需求。

weixin_26869081的博客 389

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 379

SpringCloud 微服务框架

单体架构:将业务全部功能集中到一个项目中,打成一个war包存储,部署在一台服务器中,只有一个数据库优点 :架构简单,部署成本低。适合小型项目问题:高并发性能问题,开发时代码耦合问题,部署升级时停服的问题垂直架构:拆分模块,每个模块使用自己的数据库,如果有模块需要其他模块数据时需要自己查对方模块数据库问题:大量代码冗余,系统难以维护,性能问题,部署问题分布式架构:根据业务功能对系统做拆分,每个业务功能作为独立项目开发,称为一个服务服务之间相互调用,分布式多节点部署。

web13595609705的博客 1328

VMware Ubuntu虚拟机突然断网?我用5步彻底解决了(附避坑指南)

Ubuntu虚拟机断网问题通常由网络配置冲突和VMware服务未正确绑定导致。本文提供5步解决方案:1)清理Ubuntu重复有线连接;2)重启Windows主机的VMware服务;3)检查VMware虚拟网络配置;4)重新配置Ubuntu网络参数;5)测试网络连通性。关键避坑点包括:避免多连接共存、修改配置后必重启服务、确保虚拟网卡绑定主机。通过"网卡状态→IP/路由→网关→服务"的排查思路,可快速解决虚拟机网络故障。文末附有详细的故障症状对照表,便于快速定位问题。

m0_58530495的博客 626

SpringCloud微服务框架(通俗易懂,一秒上手)

springcloud微服务架构

m0_59230408的博客 10万+

Windows部署小龙虾 OpenClaw 报错不断?参考这篇文章,轻松配置 OpenClaw 所需环境

想在Windows上部署OpenClaw却频频报错?🔧 本文详细梳理了OpenClaw部署必需环境的安装步骤和官方下载地址 📦,提供完整的验证清单和常见问题排查方法,帮你一次性搞定所有环境配置,顺利部署OpenClaw ✅

XiaoqiangClub的博客 361

基于哈夫曼编码的图像加密算法matlab仿真

哈夫曼编码是一种常用的无损数据压缩算法,其基本思想是根据字符出现的频率构造一棵哈夫曼树,将出现频率高的字符编码为短码,出现频率低的字符编码为长码,从而实现数据的压缩。在图像加密领域,哈夫曼编码也被广泛应用于图像加密算法中,基于哈夫曼编码的图像加密算法具有加密速度快、加密强度高等优点。基于哈夫曼编码的图像加密算法的基本思路是将待加密的图像分为多个小块,对每个小块进行哈夫曼编码,然后将哈夫曼编码后的结果进行异或运算,最后将异或运算后的结果重新编码,以实现图像加密。具体步骤如下:将待加密的图像分成多个小块。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 262

SpringCloud 框架进行微服务开发

本课程围绕微服务架构展开了全面而深入的讲解,从微服务的基本概念、与单体架构的对比,到 SpringCloud 框架的核心组件、微服务拆分策略与实战,再到服务治理和 OpenFeign 的应用,为学员提供了系统的微服务知识体系。通过理论讲解与实际案例相结合的方式,帮助学员理解和掌握微服务架构的关键技术点,培养学员在实际项目中运用微服务架构进行开发和解决问题的能力。在学习过程中,学员应注重实践操作,积极参与项目案例的练习,加深对知识点的理解和掌握。

weixin_41545189的博客 1025

【机器学习-17】数据变换---小波变换特征提取及应用案列介绍

小波变换作为一种前沿的数据分析工具,近年来在信号分析领域崭露头角。小波分析的理论和方法凭借其独特优势,在信号处理、图像处理、语音处理、模式识别以及量子物理等多个领域得到了广泛的应用,堪称近年来在工具及方法上的重大突破。小波变换以其多分辨率的特性,在时域和频域均展现出对信号局部特征的强大表征能力。通过伸缩和平移等运算过程,小波变换能够对信号进行多尺度聚焦分析,为非平稳信号的时频分析提供了一种有效手段。它允许我们由粗及细地逐步观察信号,从而精准地提取出有用信息。

qq_38614074的博客 2万+

SpringCloud微服务入门:使用idea搭建第一个微服务项目(附源码)

(一)什么是微服务? 在了解什么是SpringCloud之前,我们有必要去了解一下什么是微服务。在传统的项目中,我们都是把所有的代码都放在一个单体应用中,这种方式配置方便,可以很好的运行部署,但是随着项目越来越大,这个单体应用就会越来越臃肿,再加上一个项目中融合了许多人不同的代码,可维护性越来越低。以至于现在一些企业的项目中所用到的代码还是很早期的框架和代码风格。这个时候,一种叫做微服务的架构方...

Java鱼仔的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SpringCloud微服务框架——认识与拆分

2024黑马SpringCloud微服务

qq_51773341的博客 1695

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用gRPC代替SpringCloud微服务项目中的RPC框架OpenFeign

前段时间一直在忙着另一门课程的SpringCloud微服务项目,其中各个微服务之间使用的是OpenFeign进行服务之间的接口调用。这时候刚好在网络程序设计的课程中学习到了gRPC这个RPC框架,便想着在项目中使用gRPC替代部分的OpenFeign客户端。

m0_51271379的博客 3102

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

6款热门的SpringCloud微服务开源项目,总有适合你的

今天介绍六款比较热门的SpringCloud微服务项目,感兴趣的可以clone下来研究一下,相信对你学习微服务架构很有帮助。 一、Cloud-Platform 介绍 Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API 管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。 代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用Spring Boot 2.4.1、Spri

m0_63437643的博客 9864

SpringCloud微服务框架01-SpringCloud简介

本系列持续更新中 SpringCloud微服务框架01-SpringCloud简介 SpringCloud微服务框架02-Eureka服务注册与发现 SpringCloud微服务框架03 - Ribbon负载均衡 SpringCloud微服务框架04 - Config统一配置中心 文章中设计到的项目源码,会逐步整理到github上。github除了本系列文章设计到的源码信息,还有Spri...

笑小枫 9625

微服务框架springcloud(实用篇)【1】SpringCloud

springcloud实用篇【1】

努力学习ing 3394
上一篇: 第一章 SpringCloud概要
下一篇: 第三章 SpringCloud 使用Erueak服务注册中心
CrazyCoder2010
博客等级 码龄16年 298粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值