---
title: 如何开发微服务应用
tags: [快速开始,Nacos,服务注册,服务发现,服务治理]
sidebar_position: 20
slug: /quick-start/how-to-make-microservice-architecture-app
---
<head>
  <title>盘古开发框架 | 如何开发微服务 | 服务提供者 | 服务消费者</title>
  <meta name="keywords" content="盘古开发框架 | 如何开发微服务 | 服务提供者 | 服务消费者" />
</head>

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

本文介绍如何基于盘古开发框架开发一个微服务应用。文中所述仅为搭建一个微服务应用的基本框架（服务注册&服务发现），如要增加配置中心、网关代理、数据持久化、缓存等能力请参考使用指南的相关章节。

## 服务提供者
### 安装相关盘古模块

<Tabs>
<TabItem value="parent" label="盘古 Parent">

```jsx
<parent>
	<groupId>com.gitee.pulanos.pangu</groupId>
	<artifactId>pangu-parent</artifactId>
	<version>latest.version.xxx</version>
	<relativePath/>
</parent>
```
</TabItem>
<TabItem value="dependency1" label="基础模块">

```jsx
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-spring-boot-starter</artifactId>
</dependency>
```
</TabItem>
<TabItem value="dependency2" label="Dubbo 模块">

```jsx
<dependency>
	<groupId>com.gitee.pulanos.pangu</groupId>
	<artifactId>pangu-dubbo-spring-boot-starter</artifactId>
</dependency>
```
</TabItem>
<TabItem value="dependency3" label="服务接口包">

```jsx
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-examples-dubbo-api</artifactId>
    <version>1.0.0</version>
</dependency>
```

:::caution
盘古框架微服务交互基于 Dubbo 提供的面向接口代理的高性能 RPC 调用能力。所以，对于内部服务模块之间的交互调用都需要依赖服务接口包。
:::

</TabItem>
</Tabs>

### 本地配置

> 为便于理解，本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式，请参阅：[配置中心](/docs/advanced-guide/nacos-config-center) 章节。

<Tabs>
<TabItem value="application" label="application.properties">

```jsx
spring.profiles.active=${spring.profiles.active:dev}
```
</TabItem>
<TabItem value="application-dev" label="application-dev.properties">

```jsx
spring.application.name=pangu-examples-dubbo-service

dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.consumer.timeout=5000
# 服务注册中心地址
dubbo.registry.address=nacos://${nacos.server-addr}?namespace=${nacos.namespace}
dubbo.consumer.check=false
# 禁用 Dubbo 缺省的异常过滤器，盘古框架中启用了修改过的异常过滤器以支持直接抛出自定义的业务异常。
dubbo.provider.filter=-exception

logging.level.root=INFO
logging.level.com.gitee.pulanos.pangu=INFO
```
</TabItem>
</Tabs>

### 实现服务接口

```jsx title="声明接口 UserService.java"
UserEntity findUserEntity(Long id);
```

```jsx title="实现接口 UserServiceImpl.java"
@Service(version = "1.0.0", group = "pangu-showcases-dubbo-service")
public class UserServiceImpl implements UserService {
	@Override
	public UserEntity findUserEntity(Long id) {
		log.info("参数ID：{}", id);
		UserEntity userEntity = new UserEntity();
		userEntity.setId(id);
		userEntity.setName("云南码农大熊");
		return userEntity;
	}
}
```

### 启动入口

```jsx live
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
	public static void main(String[] args) {
		PanGuApplicationBuilder.init(DubboProviderApplication.class).run(args);
	}
}
// 启动参数设置（如下示例）
// -Dnacos.server-addr=127.0.0.1:8848 -Dnacos.namespace=pangu-dev
```

:::tip
通过 `@EnableDubbo` 注解开启 Dubbo 支持。由于 Dubbo 的使用 netty 作为底层网络通信，所以缺省情况下微服务启动成功后观察控制台可知并没有 Tomcat 一类 Servlet 容器随之启动。
:::


### 服务注册
成功启动应用会自动像 Nacos 服务注册中心注册服务。登录 Nacos 控制台即可在【服务管理->服务列表】页查看效果。如下图所示。

![盘古开发Dubbo服务](/resources/doc/1-pangu-framework-nacos-service-regist.png)

## 服务消费者
上述服务注册到 Nacos 服务中心以后就可以对外提供服务了。可以在任何一个 SpringBean 组件中（一般是 Service、Manager 等），引入服务接口后就像本地接口调用一样调用远程服务。Dubbo 将提供高性能的基于代理的远程调用能力，为开发者屏蔽远程调用底层细节。服务消费端所需要的依赖和提供端是一样的，这里不再赘述。仅给出消费相关代码。如下所示。

```jsx title="服务消费端，调用远程服务代码 UserAdminManager.java"
@Component
public class UserAdminManager {
	@Reference(version = "1.0.0", group = "pangu-examples-dubbo-service")
	private UserService userService;

	public void findUserEntityById(Long id){
		log.info("开始Dubbo远程调用...");
		UserEntity userEntity = userService.findUserEntity(id);
		log.info("[OK] 调用成功 {}", userEntity);
	}
}
```

## 本文相关范例源码
- [pangu-examples-dubbo-api](https://gitee.com/pulanos/pangu-framework/tree/master/pangu-examples/pangu-examples-dubbo-api)：服务接口包
- [pangu-examples-dubbo-service](https://gitee.com/pulanos/pangu-framework/tree/master/pangu-examples/pangu-examples-dubbo-service)：服务提供者
- [pangu-examples-dubbo-consumer](https://gitee.com/pulanos/pangu-framework/tree/master/pangu-examples/pangu-examples-dubbo-consumer)：服务消费者

## 下一步
继续阅读其它章节获取你想要的答案或通过我们的 [开发者社区](/community) 寻求更多帮助。