网站首页 > java教程 正文
好处不用多说,简单而言,为了更好的协同开发,尽可能的复用公共能力,将API、服务、客户端分离是王道。这里给出一个实例,基于Feign定义好API,基于Nacos给出服务发现,基于Mybatis实现账户服务,然后给出一个调用实例。整体结构图如下图1。
开发阶段:
P1、建立工程account-api,定义好API,并安装到maven仓库,通过install指令
P2、建立工程account-svr,引入account-api,并实现api相关内容
P3、将account-svr部署到tomcat
P2.1 建立工程account-cli,引入account-api,直接的调用其中方法
P3.1、将account-cli部署到tomcat
运行阶段:
1、account-svr注册到nacos
2、account-cli通过nacos调用account-svr
API开发详细
API将用来指导svr、cli的开发,以及nginx的部署。如下,定义好接口的访问路径:
public interface AccountService {
@RequestMapping(value="/createAccount/{uid}")
int createAccount(@PathVariable(value="uid")String uid);
@RequestMapping(value="/createControlAccount/{uid}")
int createControlAccount(@PathVariable(value="uid")String uid);
@RequestMapping(value="/getBalance/{uid}")
long getBalance(@PathVariable(value="uid")String uin);
@RequestMapping(value="/transfer")
int transfer(@RequestBody TransferInfo itm);
@RequestMapping(value="/reverse")
int reverse(@RequestBody TransferInfo itm);
@RequestMapping(value="/getAccountDetail/{uid}")
List<AccountDetailEntity> getAccountDetail(@PathVariable(value="uid")String uin,
@RequestParam(value="btime")String btime,
@RequestParam(value="etime")String etime,
@RequestParam(value="offset")int offset,
@RequestParam(value="count")int count);
}
然后定义好寻址服务名以及相对路径前缀:
@EnableDiscoveryClient
@FeignClient(value = "account-svr",path = "/account/")
public interface AccountFeignService extends AccountService {
}
SVR开发详细
首先实现API定义的服务接口,如下:
@RestController
@Transactional
@RequestMapping("/account")
public class AccountServiceImpl implements AccountService {
@Resource
private AccountDao objAccountDao;
@Resource
private AcountDetailDao objAcountDetailDao;
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public int createControlAccount(String uid){
if(!uid.startsWith(AccountConstant.UID_FOR_CONTROL_ACCOUNT)) return 0;
AccountEntity objAcc = new AccountEntity();
objAcc.setUserid(uid);
objAcc.setBalance(0L);
objAcc.setRemark("");
objAcc.setState(AccountConstant.STATE_NORMAL);
.........
然后,设定nacos配置中心路径
spring:
cloud:
nacos:
config:
file-extension: yaml
server-addr: www.zctx.online:80
group: account-svr
namespace: pccs
shared-configs:
- data-id: nodeinfo.yaml
group: account-svr
refresh: true
extension-configs:
- data-id: loadinfo.yaml
group: account-svr
refresh: true
- data-id: businfo.yaml
group: account-svr
refresh: true
服务注册名,以及相关的域名和端口
spring:
profiles:
active: prod
application:
name: account-svr
http:
converters:
preferred-json-mapper: gson
thymeleaf:
mode: HTML
encoding: UTF-8
content-type: text/html
cache: false
prefix: classpath:../template/
cloud:
nacos:
discovery:
server-addr: www.zctx.online:80
group: account
namespace: pccs
ip: account1.my-soft.net.cn
port: 8080
mybatis:
mapper-locations: classpath:./mappers/*Mapper.xml
type-aliases-package: account-svr.mysql
logging:
config: classpath:logback.xml
Cli开发详细
确保cli使用服务发现nacos分组、名字空间与svr一致。
spring:
cloud:
nacos:
config:
file-extension: yaml
server-addr: www.zctx.online:80
group: account-cli
namespace: pccs
shared-configs:
- data-id: nodeinfo.yaml
group: account-cli
refresh: true
extension-configs:
- data-id: loadinfo.yaml
group: account-cli
refresh: true
- data-id: businfo.yaml
group: account-cli
refresh: true
discovery:
server-addr: www.zctx.online:80
group: account
namespace: pccs
在入口类,添加服务发现的包名(@EnableFeignClients)
@SpringBootApplication
@EnableDiscoveryClient
@ServletComponentScan
@EnableFeignClients(basePackages = {"cn.net.mysoft.account.api"})
public class AccountCliApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AccountCliApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(AccountCliApplication.class);
//return super.configure(builder);
}
}
然后直接调用服务即可,可以完全感知不到http的封装,当做一个api来用
@RestController
public class Test {
@Autowired
AccountFeignService objAccountService;
@RequestMapping("/")
Map<String,String> indexPage(){
Map<String,String> res = new TreeMap<>();
res.put("balance",String.valueOf(objAccountService.getBalance("A")));
TransferInfo itm = new TransferInfo();
itm.setType(1);
itm.setVno(VnoProvider.getInstance().getUniqueString());
itm.setAmt(1);
itm.setDesc("test");
itm.setFrom(AccountConstant.CA_CHARGE);
itm.setTo("A");
res.put("transfer",String.valueOf(objAccountService.transfer(itm)));
res.put("reverse",String.valueOf(objAccountService.reverse(itm)));
return res;
}
}
nginx的配置
服务定义了域名、端口
cloud:
nacos:
discovery:
server-addr: www.zctx.online:80
group: account
namespace: pccs
ip: account.my-soft.net.cn
port: 80
api里定义了路径、如下, 在实际配置时要考虑
@FeignClient(value = "account-svr",path = "/account/")
@RequestMapping(value="/createAccount/{uid}")
int createAccount(@PathVariable(value="uid")String uid);
....
nignx的配置要按照以上黑体部分配置域名、端口、路径。例如,如果account-svr的war包名是account-svr.war,部署所在的tomcat地址是192.168.0.1,tomcat的端口是8080,则nginx的配置如下:
server
{
listen 80;
server_name account.my-soft.net.cn;
location /account/
{
proxy_pass http://192.168.0.1/account-svr/account/;
proxy_redirect off;
proxy_set_header Host account.my-soft.net.cn;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
代码
https://gitee.com/wapuboy/account
猜你喜欢
- 2025-01-13 Java开发者必须知道的11 个常用 API 整理
- 2025-01-13 Java SPI 和 API,傻傻分不清?
- 2025-01-13 最新 client-java 调用 k8s ApiServer
- 2025-01-13 java agent-02-Java Instrumentation API
- 2025-01-13 Java 中的 Http 客户端 API:管理文件
- 2025-01-13 浅谈Java interface和API的区别
- 2025-01-13 Java 如何设计 API 接口,实现统一格式返回?
- 2025-01-13 【Java版源码】YesApi接口管理系统云服务平台——国产软件推荐
你 发表评论:
欢迎- 04-24Java Collections 工具类集合框架中常用算法解析
- 04-24桶排序的简单理解
- 04-24Java集合框架底层实现原理大揭秘
- 04-24Java 集合框架全面解析:选对数据结构,提升开发效率
- 04-24c#集合排序
- 04-24Java面试中常被问到的集合类深度解读
- 04-24VBA技术资料MF278:对集合进行排序
- 04-24Spring 最常用的 7 大类注解,史上最强整理
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)