服務(wù)提供和消費(fèi)腦圖

服務(wù)提供和消費(fèi)腦圖

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

 

參見(jiàn): 服務(wù)提供者服務(wù)消費(fèi)者服務(wù)注冊(cè)中心

v服務(wù)提供者

1.服務(wù)提供者啟動(dòng),解析xml文件中配置的服務(wù),這里使用Dom4j解析。

2.將服務(wù)的一些相關(guān)信息注冊(cè)到 服務(wù)注冊(cè)中心。

注:服務(wù)相關(guān)信息:服務(wù)中心接口url,接口名稱,方法名稱,參數(shù)信息。

3.提供一個(gè)接口,服務(wù)消費(fèi)者通過(guò)調(diào)用這個(gè)接口url來(lái)調(diào)用相應(yīng)的服務(wù)。

參見(jiàn): 服務(wù)提供和消費(fèi)腦圖服務(wù)注冊(cè)中心 (1.注冊(cè)服務(wù))服務(wù)消費(fèi)者 (3.調(diào)用服務(wù))

v服務(wù)消費(fèi)者

1.服務(wù)消費(fèi)者啟動(dòng),使用dom4j解析xml獲取要消費(fèi)的服務(wù)相關(guān)接口。

2.根據(jù)接口信息去服務(wù)注冊(cè)中心判斷是否有對(duì)應(yīng)的注冊(cè)信息,如果有則通過(guò)jdk動(dòng)態(tài)代理生成相應(yīng)的代理類并注冊(cè)到spring中(代理方法中會(huì)根據(jù)服務(wù)中心返回的信息(服務(wù)提供者的url)去調(diào)用服務(wù)提供者對(duì)應(yīng)的服務(wù))。

參見(jiàn): 服務(wù)提供和消費(fèi)腦圖服務(wù)注冊(cè)中心 (2.消費(fèi)服務(wù))服務(wù)提供者 (3.調(diào)用服務(wù))

v服務(wù)注冊(cè)中心

1.將來(lái)自服務(wù)提供者信息存儲(chǔ)到redis。

2.將服務(wù)信息提供給服務(wù)消費(fèi)者。

參見(jiàn): 服務(wù)提供者 (1.注冊(cè)服務(wù))服務(wù)消費(fèi)者 (2.消費(fèi)服務(wù))服務(wù)提供和消費(fèi)腦圖

v工程示例

  注:示例中為了簡(jiǎn)單,采用rest請(qǐng)求方式來(lái)代替socket連接

v  注冊(cè)中心

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

@RestController
@RequestMapping("index")public class IndexController {

    @Autowired    private RedisCacheTemplate redisCacheTemplate;
   //注冊(cè)服務(wù)提供者信息,將信息放到redis中
    @RequestMapping(value = "register", method = RequestMethod.POST)    public SimpleResponse register(@RequestBody RegisterMessage registerMessage) {        try {
            Map<String, Object> map = new HashMap<>();            for (InterfaceMessage interfaceMessage : registerMessage.getInterfaceMessageList()) {
                interfaceMessage.setProviderUrl(registerMessage.getProviderUrl());
                map.put(ToStringBuilder.reflectionToString(interfaceMessage, ToStringStyle.SHORT_PREFIX_STYLE), true);
            }
            redisCacheTemplate.batchPut(map);            return SimpleResponse.success(map.size());
        } catch (Exception e) {
            e.printStackTrace();            return SimpleResponse.error(e.getMessage());
        }
    }

   //消費(fèi)者拿到配置的服務(wù)信息到注冊(cè)中心來(lái)匹配,驗(yàn)證是否存在這個(gè)服務(wù)
    @RequestMapping(value = "contains", method = RequestMethod.POST)    public SimpleResponse contains(@RequestBody InterfaceMessage interfaceMessage) {        try {            if(redisCacheTemplate.exist(ToStringBuilder.reflectionToString(interfaceMessage, ToStringStyle.SHORT_PREFIX_STYLE))) {                return SimpleResponse.success(true);
            } else {                return SimpleResponse.error(null);
            }
        } catch (Exception e) {
            e.printStackTrace();            return SimpleResponse.error(e.getMessage());
        }
    }

    @RequestMapping(value = "test", method = {RequestMethod.GET, RequestMethod.POST})    public SimpleResponse test(@RequestParam String providerUrl){        return SimpleResponse.success(providerUrl);
    }
}

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

v  服務(wù)提供者

<?xml version="1.0" encoding="UTF-8"?><services-provider>
    <service id="testService" interface="com.hjzgg.simulation.api.ITestService"/></services-provider>

  自定義xml,配置將要注冊(cè)的服務(wù)id及對(duì)應(yīng)的接口類。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

# 內(nèi)置tomcat服務(wù)器配置
server.port=8088
server.context-path=/provider-server

#打印彩色日志
spring.output.ansi.enabled=always

# 日志打印級(jí)別
logging.level.root=debug

# serviceservice.xml.path=classpath:service-provider.xml 自定義服務(wù)提供者配置文件 位置
service.provider.path=http://localhost:8088/provider-server/index/provider  服務(wù)提供者執(zhí)行相應(yīng)服務(wù)接口
service.register.path=http://localhost:8090/register-server/index/register  調(diào)用注冊(cè)中心 接口

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.hjzgg.simulation.common.node.InterfaceMessage;import com.hjzgg.simulation.common.node.RegisterMessage;import com.hjzgg.simulation.common.parsexml.BeanNode;import com.hjzgg.simulation.common.parsexml.ParseServiceXML;import com.hjzgg.simulation.common.response.ReturnCode;import com.hjzgg.simulation.common.utils.RestTemplateUtils;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.context.EnvironmentAware;import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;import org.springframework.core.env.Environment;import org.springframework.core.type.AnnotationMetadata;import org.springframework.http.MediaType;import org.springframework.util.CollectionUtils;import java.util.ArrayList;import java.util.List;public class Registrar implements ImportBeanDefinitionRegistrar, EnvironmentAware {    private static Logger logger = LoggerFactory.getLogger(Registrar.class);    private String servicesXmlPath;    private String serviceProviderPath;    private String serviceRegisterPath;

    @Override    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        List<BeanNode> beanNodes = ParseServiceXML.getProviderServices(servicesXmlPath); 解析自定義服務(wù)提供配置文件
        List<InterfaceMessage> list = new ArrayList<>();        for(BeanNode beanNode : beanNodes) { 根據(jù)服務(wù)對(duì)應(yīng)id去 尋找實(shí)現(xiàn)的 bean            if(!registry.containsBeanDefinition(beanNode.getBeanName())) {
                logger.error("接口" + beanNode.getBeanName() + " " + beanNode.getInterfaceCls().getTypeName() + " 沒(méi)有對(duì)應(yīng)的實(shí)現(xiàn)類");
            } else {
                InterfaceMessage interfaceMessage = new InterfaceMessage();
                interfaceMessage.setBeanName(beanNode.getBeanName());
                interfaceMessage.setInterfacType(beanNode.getInterfaceCls().getTypeName());
                list.add(interfaceMessage);
            }
        }        if(!CollectionUtils.isEmpty(list)) { 將配置的服務(wù)信息發(fā)送的注冊(cè)中心
            RegisterMessage registerMessage = new RegisterMessage();
            registerMessage.setProviderUrl(this.serviceProviderPath);
            registerMessage.setInterfaceMessageList(list);            try {
                String result = RestTemplateUtils.post(this.serviceRegisterPath, (JSONObject) JSON.toJSON(registerMessage), MediaType.APPLICATION_JSON_UTF8);
                JSONObject retJson = JSONObject.parseObject(result);                if(retJson.getInteger("code") == ReturnCode.SUCCESS.getValue()) {
                    logger.debug("服務(wù)注冊(cè)成功...");
                } else {
                    logger.error("服務(wù)注冊(cè)失敗..." + retJson.getString("msg"));
                }
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("服務(wù)注冊(cè)失敗..." + e.getMessage());
            }
        }
    }

    @Override    public void setEnvironment(Environment environment) { 獲取環(huán)境變量        this.servicesXmlPath = environment.getProperty("service.xml.path");        this.serviceProviderPath = environment.getProperty("service.provider.path");        this.serviceRegisterPath = environment.getProperty("service.register.path");        assert(StringUtils.isNotEmpty(this.serviceProviderPath) && StringUtils.isNotEmpty(serviceRegisterPath) &&
        StringUtils.isNotEmpty(this.servicesXmlPath));
    }
}

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;/**
 * Created by hujunzheng on 2017/7/7. */@Configuration
@Import(Registrar.class)public class Config { 注冊(cè)服務(wù)配置啟動(dòng)}

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

"index" = "invoke", method === ((bean = ContextUtils.getBean(serviceMessage.getBeanName(), serviceMessage.getRequireType())) != <Class<?>> classList =  ArrayList<>(serviceMessage.getArgs() != = ReflectionUtils.findMethod(bean.getClass(), serviceMessage.getMethodName(), classList.toArray( Class<?>[0(method !=  SimpleResponse.error("服務(wù)" + serviceMessage.getRequireType().getTypeName() + "中沒(méi)有對(duì)應(yīng)參數(shù)"
                            + ToStringBuilder.reflectionToString(classList) + "的" + serviceMessage.getMethodName() + "方法" SimpleResponse.error("沒(méi)有名稱為" + serviceMessage.getBeanName() + "且類型為"
                        + serviceMessage.getRequireType().getTypeName() + "對(duì)應(yīng)的bean"

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

v  服務(wù)消費(fèi)者

<?xml version="1.0" encoding="UTF-8"?><services-consumer>
    <service ref="testService" interface="com.hjzgg.simulation.api.ITestService" url="http://localhost:8088/provider-server/index/provider"/></services-consumer>

  自定義服務(wù)消費(fèi)者配置,服務(wù)引用名稱,接口類型,調(diào)用服務(wù)提供者URL

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

# 內(nèi)置tomcat服務(wù)器配置
server.port=8089server.context-path=/consumer-server

#打印彩色日志
spring.output.ansi.enabled=always

# 日志打印級(jí)別
logging.level.root=debug

# service xml
service.xml.path=classpath:service-consumer.xml 自定義服務(wù)消費(fèi)配置文件位置service.contains.url=http://localhost:8090/register-server/index/contains 注冊(cè)中心服務(wù)查詢接口service.invoke.url=http://localhost:8088/provider-server/index/invoke 服務(wù)提供者執(zhí)行相應(yīng)服務(wù)接口

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.hjzgg.simulation.common.dynamic.JdkDynamicProxy;import  
電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)版權(quán)聲明:本文原創(chuàng)發(fā)表于博客園,作者為小眼兒。 本文歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則視為侵權(quán)。
工作之余: lintcode簡(jiǎn)單題目解析電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開(kāi)發(fā)培訓(xùn)lintcode中等題目解析

http://www.cnblogs.com/hujunzheng/p/7131212.html