探花交友day00—探花交友前置Dubbo Posted 2023-04-07 陶然同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探花交友day00—探花交友前置Dubbo相关的知识,希望对你有一定的参考价值。
目录
1、Dubbo的前世今生
2、Dubbo的快速入门
2.1、Dubbo的基本架构
2.2、Nacos
2.3、管理后台
2.4、入门案例
2.5、代码优化
3、Dubbo高级特性
3.2、超时与重试
3.3、启动检查
3.4、多版本
3.5、负载均衡
4、SpringCloud整合Dubbo
4.1、功能概述
4.2、入门案例
1、Dubbo的前世今生
2011年10月27日,阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo,服务治理和SOA的设计理念开始逐渐在国内软件行业中落地,并被广泛应用。
2、Dubbo的快速入门
2.1、Dubbo的基本架构
节点角色说明:
节点 角色说明 Provider 暴露服务的服务提供方。 Consumer 调用远程服务的服务消费方。 Registry 服务注册与发现的注册中心。 Monitor 统计服务的调用次数和调用时间的监控中心。
调用关系说明:
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
2.2、Nacos
Nacos 是阿里巴巴的产品,是一个集服务发现,配置管理的平台,在国内受欢迎程度较高。
1、找到今日资料中的nacos安装包
2、解压到没有中文和特殊字符的目录
3、进入bin目录,执行启动命令
#进入bin目录
cd bin
#启动
startup.cmd -m standalone
4、浏览器查看:http://127.0.0.1:8848/nacos
2.3、管理后台
DubboAdmin 是阿里巴巴管理提供的管理控制台,可以实现服务查询,详情展示,服务测试等功能。借由DubboAdmin可以更好的帮助开发人员对服务进行管理和监控
#1、下载代码:
git clone https://github.com/apache/dubbo-admin.git
#2、在 dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址
#3、构建
mvn clean package -D maven.test.skip=true
#4、启动
mvn --projects dubbo-admin-server spring-boot:run
#或者
cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar
#5、访问 http://localhost:8080
2.4、入门案例
需求:使用Dubbo构建分布式架构,完成根据用户id查询用户
2.4.1、服务提供者
搭建环境
(1)创建user-provider模块导入依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql </groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--dubbo的起步依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.8</version>
</dependency>
</dependencies>
(2)编写引导类
package cn.itcast.user;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("cn.itcast.user.mapper")
@SpringBootApplication
public class UserProviderApplication
public static void main(String[] args)
SpringApplication.run(UserProviderApplication.class, args);
代码实现
(1)UserServiceImpl
package cn.itcast.user.service;
import cn.itcast.user.api.UserService;
import cn.itcast.user.domain.User;
import cn.itcast.user.mapper.UserMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
@DubboService
public class UserServiceImpl implements UserService
@Autowired
private UserMapper userMapper;
//根据id查询用户名称
public String queryUsername(Long id)
return userMapper.findById(id).getUsername();
配置文件
server:
port: 18081
spring:
datasource:
url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: user-provider
logging:
level:
cn.itcast: debug
pattern:
dateformat: HH:mm:ss:SSS
dubbo:
protocol:
name: dubbo
port: 20881
registry:
address: nacos://127.0.0.1:8848
scan:
base-packages: cn.itcast.user.service
2.4.2、服务消费者
搭建环境
(1)创建user-consumer模块导入依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--dubbo的起步依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.8</version>
</dependency>
</dependencies>
(2)配置引导类
package cn.itcast.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UserConsumerApplication
public static void main(String[] args)
SpringApplication.run(UserConsumerApplication.class, args);
代码实现
package cn.itcast.user.controller;
import cn.itcast.user.api.UserService;
import cn.itcast.user.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController
//引用远程服务
@DubboReference
private UserService userService;
@GetMapping("/username/1")
public String findUserName(@PathVariable("id") Long id)
return userService.queryUsername(id);
配置文件
server:
port: 18080
spring:
application:
name: user-consumer
logging:
level:
cn.itcast: debug
pattern:
dateformat: HH:mm:ss:SSS
dubbo:
registry:
address: nacos://127.0.0.1:8848
2.5、代码优化
将接口抽取为独立模块,并且把接口有关的domain都放到这个模块中
(1)创建user-api模块引入依赖
(2)将UserService接口和User对象导入user-api模块下
(3)User对象实现序列化接口
package cn.itcast.user.domain;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable
private Long id;
private String username;
private String address;
3、Dubbo高级特性
3.2、超时与重试
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。
在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
user-consumer模块中添加配置信息
dubbo:
registry:
address: nacos://127.0.0.1:8848
consumer:
timeout: 3000
retries: 0
3.3、启动检查
为了保障服务的正常可用,Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常
在正式环境这是很有必要的一项配置,可以保证整个调用链路的平稳运行
在开发时,往往会存在没有提供者的情况。由于启动检查的原因,可能导致开发测试出现问题
可以通过check=false关闭
user-consumer模块中添加配置信息
dubbo:
registry:
address: nacos://127.0.0.1:8848
consumer:
check: false
3.4、多版本
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
Dubbo提供了提供者多版本的支持,平滑处理项目功能升级部署
(1)user-provider定义新的服务实现类UserServiceImpl2,指定版本
@DubboService(version = “2.0.0”)
public class UserServiceImpl2 implements UserService
…………
(2)user-consumer消费者调用时,指定版本调用
@RestController
@RequestMapping("/user")
public class UserController
//引用远程服务
@DubboReference(version = "2.0.0")
private UserService userService;
………
3.5、负载均衡
在集群部署时,Dubbo提供了4种负载均衡策略,帮助消费者找到最优提供者并调用
Random :按权重随机,默认值。按权重设置随机概率。
RoundRobin :按权重轮询
LeastActive:最少活跃调用数,相同活跃数的随机。
ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。
@RestController
@RequestMapping("/user")
public class UserController
//引用远程服务
@DubboReference(loadbalance = "roundrobin")
private UserService userService;
4、SpringCloud整合Dubbo
通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。
4.1、功能概述
将Dubbo集成至SpringCloud主要是替换Ribbo或者Feign实现远程调用。加入Dubbo后,整体的架构如下:
4.2、入门案例
4.2.1、抽取接口
定义接口模块dubbo-api,并将UserService接口抽取到此模块下
package cn.itcast.dubbo.api;
import cn.itcast.dubbo.domain.User;
public interface UserService
User queryById(Long id);
4.2.2、项目依赖
父工程加入SpringCloud Alibaba依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
消费者和提供者引入nacos注册中心和Dubbo依赖
<!--nacos注册中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--springcloud alibaba dubbo依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4.2.3、服务提供者
修改UserService实现UserApi接口。并使用@DubboService注解替换@Service对外暴露dubbo服务
package cn.itcast.user.service;
import cn.itcast.dubbo.api.UserService;
import cn.itcast.dubbo.domain.User;
import cn.itcast.user.mapper.UserMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
@DubboService
public class UserServiceImpl implements UserService
@Autowired
private UserMapper userMapper;
public User queryById(Long id)
return userMapper.findById(id);
在application.yml中添加配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
#配置dubbo,注册中心,暴露的端口和协议,dubbo注解的包扫描
dubbo:
protocol:
name: dubbo
port: 20881
registry:
address: spring-cloud://localhost #使用SpringCloud中的注册中心
scan:
base-packages: cn.itcast.user.service #dubbo中包扫描
4.2.4、服务消费者
在OrderController中引入dubbo服务。调用UserService查询用户
package cn.itcast.order.controller;
import cn.itcast.dubbo.api.UserService;
import cn.itcast.dubbo.domain.Order;
import cn.itcast.dubbo.domain.User;
import cn.itcast.order.service.OrderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("order")
public class OrderController
@Autowired
private OrderService orderService;
@DubboReference
private UserService userService;
@GetMapping("orderId")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId)
//根据id查询订单
Order order = orderService.queryOrderById(orderId);
//获取用户id
Long userId = order.getUserId();
//查询用户
User user = userService.queryById(userId);
//设置用户对象
order.setUser(user);
// 根据id查询订单并返回
return order;
在Order-service的模块中添加dubbo配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
#dubbo配置
dubbo:
registry:
address: spring-cloud://localhost #使用cloud的注册中心
consumer:
check: false #dubbo默认有启动检查
retries: 0 #dubbo内置的重试机制
SAP成都C4C小李探花:浅谈Fiori Design Guidelines
Jerry: 我和周帅认识不久,自去年7月SAP成都研究院Cloud for Customer(以下简称为C4C)开发团队组建至今,根据这段时间和周帅愉快的合作经历,我觉得如果把周帅比作我读过的小说里的一位主人公,我认为是古龙《风云第一刀》中的主角李寻欢。
李寻欢出身名门,“一门七进士,父子三探花”,连其宿敌上官惊鸿也曾当面吐槽:“你本是三代探花,风流翰林,名第高华,天之骄子,又何苦偏偏要到这肮脏江湖中来做浪子?”
周帅也是出身名校,美国研究生毕业,在美国SAP实习过,做的也不是我们这些普通程序猿做的脏活累活,而是高大上的人机交互设计工作。
李寻欢是《风云第一刀》书中第一高帅富。小李飞刀在百晓生兵器谱排第三,在古龙笔下“谁的刀快谁就牛逼”的江湖里,这个排名相当于现在的福布斯全球富豪榜第三位。
书中没有提到李寻欢师承何处,一登场他的飞刀,轻功,内力等技能就点满了,而周帅的交互设计技能也没有人教,是在美国大学里自学习得。
古龙很少在书中花笔墨对人物外貌进行正面描写,我复制一段孙小红眼中的李寻欢:
而周帅在成都SAP研究院同事中绝对是鹤立鸡群的存在,超过190的身高,我每次和他对话得仰着头,费劲。最近周帅又换了个光头的发型。这个非常依赖颜值的发型得贝克汉姆陈冠希吴彦祖这类人物才hold得住,而周帅驾驭得轻车熟路,无怪乎深受SAP成都C4C开发团队所有女同事的喜爱。
古龙笔下的高帅富主角们身边是不缺美人的,比如“彩蝶双飞翼,盗帅夜留香”的楚香帅。而李寻欢作为一位浊世佳公子, 无论行至何处,一颗心始终在林诗音身上。有文为证:
而周帅,虽然漂泊了4个城市,换了3个办公地,但始终对SAP情有独钟。虽然期间身处机会无数的美国Palo Alto和互联网公司云集的北京,周帅对SAP的挚爱从未动摇,这份坚持正如李寻欢手中永远雕刻不完的那个林诗音的木像。
下面是周帅的正文。
大家好,我叫周帅,是SAP Hybris C4C团队的一名交互设计师。我这五年常住了四个城市,换了三个办公地,横跨了两个国家,就职于一家公司。
我本科和研究生学的都是工业设计专业,然而在北卡的两年研究生学习中,我发现了交互设计比工业设计更吸引我,便选修了一些相关的课程,到处参加专业性的讲座,也自学了许多相关的技能。在较短时间内完成了工业设计到交互设计的转型。
我是2015年年底作为实习设计师加入SAP Palo Alto的,当时是在SAP?Hybris C4C交互设计组实习。
由于签证到期,于16年5月回国,在北京SAP干了一年左右的前端开发。去年C4C在中国正式成立开发团队之后,我作为交互设计师重返了C4C,也从北京搬来了成都。
正文:世界上一些著名的大型科技公司都有自己的设计语言(Design Language),从最初苹果的Human Interface Guideline(HIG),?到后来居上的谷歌?Material Design,?再到去年新鲜出炉的微软Fluent Design。这些设计语言已经深度融入并改变了人们日常对电子设备的使用习惯。在这些设计语言中,当然也有我们SAP独创的设计语言:获得过红点设计大奖的Fiori Design。
Fiori的问世与SAP创始人之一Hasso Plattner对设计的重视有关。早在2005年,他便在斯坦福大学捐资成立了Hasso Plattner Institute(HPI) of Design,?也就是后来大名鼎鼎的d.school。d.school能在全世界率先把设计思维(Design Thinking)作为一个正式的方法论向工科学生传授,并且Hasso积极将其融入SAP的DNA中,也是由于他看中了设计思维的发展潜力及设计的力量。现在我们普遍采用的设计先行的开发流程(Design-Led Development Process)便源于此。他当时说过SAP有些产品既不实用也不吸引客户,而我们还在销售它们,这在云计算时代行不通。这最终也促成了Fiori的诞生。
Fiori?致力于建立标准的现代化企业级用户体验,通过仅给客户提供他们真正所需的内容,使他们对自己的业务有完全的掌控。这个核心目标体现在五个设计原则中:基于用户角色,可适配不同设备,流畅直观的体验,简单和令人愉悦。
SAP Fiori 1.0?是在2013年正式推出的,一经面世便备受关注,并很快应用在了SAPS/4HANA, Success Factors, Ariba移动端以及C4C等解决方案中。所谓的Fiori 1.0是指所使用的SAP UI5控件版本介于1.26到.1.38之间的样式,大概长下面这个样子?。
而从2016年10月开始,控件版本升到1.40之后,Fiori正式进入了2.0时代。画风更加唯美的同时,也进一步增强了灵活性和空间的利用。比如用户处理主线任务的可以兼顾追踪其他区域的动态,提升了导航特性,通过”viewport”可以做到跨界面交互,以及可以跨屏查看个人设置等等。因为本文是通识介绍,所以在此就不详细介绍设计的细节了。
Fiori是SAP的Global Design团队打造的设计语言,像是一个总纲,提供整体的原则及使用规范层面上的指导,但不针对具体的某个产品。
所以我们C4C成都组所属的SAP C4C?产品线就拥有一支专属的设计团队。团队内部还细分为针对业务的设计师,针对框架的设计师,视觉设计师和用户研究可用性测试的设计师。大部分设计师在硅谷,有三个在班加罗尔,我一个在成都,是针对框架的设计师。
上图是C4C产品现在的主页,乍一看是不是像极了Fiori 1.0界面?没错,作为SAP家族重要成员之一,C4C的确使用了大量的Fiori标准控件,这样能确保我们的产品与众多其他SAP产品保持样式的一致性,从而令用户对SAP拥有更统一的认知。然而由于一些特有的业务场景需要,C4C也有很多自己增强的控件。比如上图左侧黑色的导航列表,就是继承了标准控件的C4C特有控件。这么做可以进一步丰富了产品的特性,但同时也增加了日后维护成本。比如我们最近在做的主题升级,开发人员和设计师就耗费了很大精力对控件逐个定位并修改样式。我们设计团队也意识到了这个问题,现在正在组织编写C4C自己的设计规范,把C4C产品里所有使用到的控件都囊括在内,与UI5标准控件清晰的区分开。设计规范也将详细规定何时何地使用何种控件,并提供详细视觉设计稿,以便开发人员准确理解,避免歧义。
我们内部把这个界面叫做RUI(Responsive User Interface),因为它可以适配手机,平板,笔记本和台式机,也可以同时在app和浏览器上使用。
C4C大概是在2015年逐渐采用RUI设计的,那么C4C在此之前长什么样呢?请看下图。
是不是一股复古风扑面而来?我们内部管它叫UX3或者html5。因为它使用的是html5框架,因此不支持app端的使用。虽然不如RUI好看,但目前它的配置功能比RUI要齐全,所以很多客户现在还在使用这个版本。不过在不远的将来,RUI会具备UX3所有的功能,而且目前我们也已停止针对UX3的新功能开发,它会逐渐的被RUI取代。而这还不是C4C最老的版本,下图才是。
我们称之为Silverlight,因为用的是微软的Silverlight框架。这大概是2011-2012年C4C刚成立时的版本。而就在不久前,官宣停止对这个版本的维护,因此这个版本已经正式退出历史舞台。
我们用倒序的方式看了C4C的演化史,而这三个只是大阶段,每个阶段内都在根据客户的反馈及我们的调研结果不停地进行UX的优化。而一切设计的初衷就是让我们产品的用户用的舒适满意,并吸引更多的客户购买我们的产品。
本文转载于:猿2048→ https://www.mk2048.com/blog/blog.php?id=hbjc11jhc1j
以上是关于探花交友day00—探花交友前置Dubbo的主要内容,如果未能解决你的问题,请参考以下文章
玩转全球最大同性交友网站--- 开源社区GitHub
如何快速读取二进制文件
交友助手软件
基于php+mysql的校园交友网站
婚恋交友网站开发社交聊天平台代码分享
婚恋交友网站开发社交聊天平台代码分享