# kc-sofastack-demo
**Repository Path**: yaccbison/kc-sofastack-demo
## Basic Information
- **Project Name**: kc-sofastack-demo
- **Description**: sofastack 微服务例子
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-12-29
- **Last Updated**: 2023-12-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: sofa
## README
# 使用 SOFAStack 快速构建微服务
## 前置条件
注意:您需要自行部署后端环境依赖,并修改示例中的服务依赖地址即可使用。
- [必选]部署注册中心:https://www.sofastack.tech/projects/sofa-registry/server-quick-start/
- [必须]部署数据库:本地自行搭建数据库,然后导入 [DDL.sql](https://github.com/sofastack-guides/kc-sofastack-demo/blob/master/DDL.sql)
- [可选]部署LookoutServer:https://www.sofastack.tech/projects/sofa-lookout/quick-start-metrics-server/
- [可选]部署Zipkin:https://zipkin.io/pages/quickstart.html
## 实验内容
本实验基于 SOFAStack 快速构建一个微服务,主要包括以下几个部分:
* 使用 SOFABoot + SOFARPC 发布服务
* 使用 SOFABoot + SOFARPC 调用服务
* 通过 ZipKin 查看 SOFATracer 上报的 Tracer 信息
* 通过 SOFALookout 查看上报的 Metrics 信息
## 架构图

## 任务
#### 1、任务准备
从 github 上将 demo 工程克隆到本地
```bash
git clone https://github.com/sofastack-guides/kc-sofastack-demo.git
```
然后将工程导入到 IDEA 或者 eclipse。导入之后界面如下:

* balance-mng:余额管理系统,提供扣减余额服务
* stock-mng:库存管理系统,提供扣减库存服务
#### 2、引入依赖
将下面的依赖引入到 balance-mng 和 stock-mng 工程模块的 pom.xml 文件中。
```xml
com.alipay.sofa
rpc-sofa-boot-starter
com.alipay.sofa
tracer-sofa-boot-starter
com.alipay.sofa
registry-client-all
com.alipay.sofa
runtime-sofa-boot-starter
com.alipay.sofa.lookout
lookout-sofa-boot-starter
```
balance-mng 工程需要将依赖引入 balance-mng/balance-mng-impl/pom.xml 文件:

stock-mng 工程直接将依赖引入 stock-mng/pom.xml 文件:

#### 3、添加配置
将如下配置复制到 balance-mng 和 stock-mng 工程模块的 application.properties 中。
```properties
# 1、添加服务注册中心地址
com.alipay.sofa.rpc.registry.address=sofa://localhost:9603
# 2、添加 tracer 数据上报的服务端 zipkin 地址
# 如果上面前置条件未搭建 tracer,可以不配置
com.alipay.sofa.tracer.zipkin.base-url=http://localhost:9411
# 3、添加 metrics 数据上报的服务端地址
# 如果上面前置条件未搭建 lookout-server,可以不配置
com.alipay.sofa.lookout.agent-host-address=localhost
```
balance-mng 工程需要将配置添加至 balance-mng/balance-mng-bootstrap/src/main/resources/application.properties 文件:

另外数据库配置修改为自己的数据库信息:
```
# database config
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/stock_db
spring.datasource.username=root
spring.datasource.password=root
```
stock-mng 工程需要将配置添加至 stock-mng/src/main/resources/application.properties 文件:

另外数据库配置修改为自己的数据库信息:
```
# database config
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/stock_db
spring.datasource.username=root
spring.datasource.password=root
```
#### 4、修改 unique id
由于所有人共用一套服务发现,为区分不同用户发布的服务,需要为服务增加 unique id。
KubeCon workshop 会给每个用户准备一个 SOFAStack 账号,格式为 user0@sofastack.io 到 user99@sofastack.io,去掉 @sofastack.io 部分,账户前半部分的 user0 至 user99 即可作为 unique id。
> 注意:balance-mng 和 stock-mng 里的 unique id 需要一致。
balance-mng 工程需要在 balance-mng/balance-mng-bootstrap/src/main/resources/application.properties 文件修改:

stock-mng 工程需要在 stock-mng/src/main/resources/application.properties 文件修改:

#### 5、发布 SOFARPC 服务
在 BalanceMngImpl 类上加上 @SofaService 注解 和 @Service 注解,将其发布成一个 SOFARPC 服务:
```java
import org.springframework.stereotype.Service;
import com.alipay.sofa.runtime.api.annotation.SofaService;
import com.alipay.sofa.runtime.api.annotation.SofaServiceBinding;
@Service
@SofaService(interfaceType = BalanceMngFacade.class, uniqueId = "${service.unique.id}", bindings = { @SofaServiceBinding(bindingType = "bolt") })
```
增加之后的 BalanceMngImpl 类如下图所示:

在 StockMngImpl 类上加上 @SofaService 注解 和 @Service 注解,将其发布成一个 SOFARPC 服务:
```java
import org.springframework.stereotype.Service;
import com.alipay.sofa.runtime.api.annotation.SofaService;
import com.alipay.sofa.runtime.api.annotation.SofaServiceBinding;
@Service
@SofaService(interfaceType = StockMngFacade.class, uniqueId = "${service.unique.id}", bindings = { @SofaServiceBinding(bindingType = "bolt") })
```
增加之后的 StockMngImpl 类如下图所示:

#### 6、引用 SOFARPC 服务
在 BookStoreControllerImpl 类中的 stockMngFacade 变量上方加 @SofaReference 注解,用于引用 SOFARPC 服务:
```java
import com.alipay.sofa.runtime.api.annotation.SofaReference;
import com.alipay.sofa.runtime.api.annotation.SofaReferenceBinding;
@SofaReference(interfaceType = StockMngFacade.class, uniqueId = "${service.unique.id}", binding = @SofaReferenceBinding(bindingType = "bolt"))
```
在 BookStoreControllerImpl 类中的 balanceMngFacade 变量上方加 @SofaReference 注解,用于引用 SOFARPC 服务:
```java
import com.alipay.sofa.runtime.api.annotation.SofaReference;
import com.alipay.sofa.runtime.api.annotation.SofaReferenceBinding;
@SofaReference(interfaceType = BalanceMngFacade.class, uniqueId = "${service.unique.id}", binding = @SofaReferenceBinding(bindingType = "bolt"))
```
增加之后的 BookStoreControllerImpl 类如下图所示:

#### 7、实验验证
运行 BalanceMngApplication 和 StockMngApplication 即可启动应用。应用启动之后,通过浏览器访问:[http://localhost:8080](http://localhost:8080) 即可正常操作页面:

浏览器访问 [http://localhost:9411](http://localhost:9411),查看链路数据上报以链路关系图:

浏览器访问 [http://localhost:9090](http://localhost:9090) 即可查看上报 metrics:

* `jvm.threads.totalStarted{app="stock_mng"}`:可以查看 JVM 启动线程数
* `rpc.consumer.service.stats.total_count.count{app="stock_mng"}`:可以查看 stock_mng 应用的调用次数
关于 SOFALookout 的更多用法,请参考: [https://www.sofastack.tech/sofa-lookout/docs/Home](https://www.sofastack.tech/sofa-lookout/docs/Home)
## 更多
- [下载本次 Demo 幻灯片](https://gw.alipayobjects.com/os/basement_prod/b16fd217-b82b-436e-8b0d-452e636e072b.pdf)。