在云原生时代,微服务、容器技术、DevOps,持续交付是四大元素。而对于开发人员微服务的掌握是重中之重。Java中SpringBoot凭借优秀的特性为构造Java应用带来了极大便利。因此,微服务构建是SpringCloud利用其生态,很好地建立起来SpringCloud系列的架构解决方案。而SpringCloud Netfflix由于停更,SpringCloudAlibaba凭借对第一代的兼容性以及极好的功能拓展、便利性提升,而占据了Java微服务较大市场。微服务的整个架构和SpringCloudAlibaba生态如下,而本文将进行一些简单Demo的实战记录,相关代码放在个人github。


我们都知道微服务将应用的粒度划分很小,便于协作开发和故障迁移。那么粒度变小之后,必然服务的数量上来了,而且服务间也存在着一定关系,需要去调用,此刻微服务一般还部署在不同机器之上,因此不能像本地调用那样去调用,而需要通过网络通信方式去调用。因此复杂度瞬间上来,我们主要就需要去考虑以下复杂度:
对于上面的系列问题,我定义为 多 的问题,相比 单体(少),我们无需协作管理,而对于 多,就犹如 人群 形成 了社会,此时我们则需要进行管理,而对于多的管理在计算机中有很多体现,例如:
所以说,解决该问题,我们也可如法炮制,采用中心机构进行管理。而微服务具体的管理方式,则是通过服务注册中心进行统一管理。有了统一的注册列表和各服务的信息,那么想去调用其他服务,检查服务状态等就更加容易,而对于常用的服务调用则是采用 REST Http通信和 RPC远程调用两种主要方式。
对于SpringCloudAlibaba,RPC调用框架,Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。更多特性可以参考官网
对于SpringCloudAlibaba,服务注册与发现、配置中心,nacos具有很强的表现,随着2.0版本 gRpc的引入,通信性能极强,支撑百万实例。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.3.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.1.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>


<dependencies>
<dependency>
<groupId>org.examplegroupId>
<artifactId>cloud-demo-discovery-dubbo-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-dubboartifactId>
dependency>
dependencies>
server:
port: 8888
spring:
application:
name: cloud-demo-discovery-dubbo-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
#dubbo:
# registry:
# address:
#dubbo:
# cloud:
# subscribed-services:
dubbo:
application:
#
id: cloud-demo-discovery-dubbo-provider
scan:
# 服务扫描基础包
base-packages: com.lyf.dubboprovider
# org.springframework.cloud.alibaba.dubbo.bootstrap
protocol:
# 协议
name: dubbo
# dubbo协议端口(-1自增端口,从20880开始)
port: -1
cloud:
subscribed-services: '*'
/**
* @author liyunfei
*/
// dubbo贡献给apache了
//@Service
@Service
public class EchoServiceImpl implements EchoService {
private final static Logger LOGGER = LoggerFactory.getLogger(EchoServiceImpl.class);
// publishProvider interfaceName is empty
@Override
public String echo(String msg) {
//org.apache.dubbo.rpc.service.EchoService
LOGGER.info("[provider]"+msg);
return "provider provide fun:receive msg:"+msg;
}
}
@EnableDiscoveryClient
@SpringBootApplication
//@EnableDubbo
public class DemoDubboProviderApp {
public static void main(String[] args) {
SpringApplication.run(DemoDubboProviderApp.class,args);
}
}
server:
port: 8900
spring:
application:
name: cloud-demo-discovery-dubbo-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# nacos registry, DEFAULT_GROUP cloud-demo-discovery-dubbo-provider 192.168.247.1:8888 register finished
dubbo:
application:
id: cloud-demo-discovery-dubbo-consumer
cloud:
# 订阅服务提供者, * 提供所有
subscribed-services: cloud-demo-discovery-dubbo-provider
@RestController
public class CallController {
private final static Logger LOGGER = LoggerFactory.getLogger(CallController.class);
//@Reference
@Reference(check = false)
EchoService echoService;
@GetMapping("/call/test/{msg}")
String test(@PathVariable("msg")String msg){
LOGGER.info("[consumer]"+msg);
return echoService.echo(msg);
}
}
@EnableDiscoveryClient
@SpringBootApplication
@EnableDubbo
public class DemoDubboConsumerApp {
public static void main(String[] args) {
SpringApplication.run(DemoDubboConsumerApp.class,args);
}
}

5. 依次启动provider,consumer,并进行接口调用测试