Java实现API、服务与客户端代码工程分离

好处不用多说,简单而言,为了更好的协同开发,尽可能的复用公共能力,将API、服务、客户端分离是王道。这里给出一个实例,基于Feign定义好API,基于Nacos给出服务发现,基于Mybatis实现账户服务,然后给出一个调用实例。整体结构图如下图1。

图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 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 indexPage(){
        Map 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

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章