среда, 12 апреля 2023 г.

Awesome Integration project

Hi everyone!

I'm glad to share my open source project with you. It's called Awesome Integration, and it's a curated list of system integration software, patterns and resources. From API Design, API Documentation and API Testing tools to API Gateways and API Management, from Message Brokers to Messaging as a Service, from Integration frameworks and ESB to Integration Platform as a Service, etc.

If you're interested in contributing to Awesome Integration, I'd love to have you! 
You can check out our GitHub repository here: https://github.com/stn1slv/awesome-integration#readme
Let me know what you think!

четверг, 1 марта 2018 г.

Ошибка "sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target" и вариант её решения

Ошибка:
После включения HTTPS (и отключения HTTP) может возникнуть следующая ошибка:
 <oracle.soa.bpel.engine.ws> <BEA-000000> <got FabricInvocationException  
 sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  
     at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)  
     at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)  
     at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)  
     at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)  
     at sun.security.validator.Validator.validate(Validator.java:260)  
     at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)  
     at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)  
     at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)  
     at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1454)  
     at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:213)  
     at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913)  
     at sun.security.ssl.Handshaker.process_record(Handshaker.java:849)  
     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1035)  
     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344)  
     at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:721)  
     at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)  
     at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:167)  
     at HTTPClient.HTTPConnection.sendRequest(HTTPConnection.java:3398)  
     at HTTPClient.HTTPConnection.handleRequest(HTTPConnection.java:3310)  
     at HTTPClient.HTTPConnection$10.run(HTTPConnection.java:3061)  
     at HTTPClient.HTTPConnection$10.run(HTTPConnection.java:3052)  
     at HTTPClient.HttpClientConfiguration.doAction(HttpClientConfiguration.java:708)  
     at HTTPClient.HTTPConnection.doAction(HTTPConnection.java:5497)  
     at HTTPClient.HTTPConnection.setupRequest(HTTPConnection.java:3052)  
     at HTTPClient.HTTPConnection.Get(HTTPConnection.java:927)  
     at HTTPClient.HTTPConnection.Get(HTTPConnection.java:831)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.openAsStreamConnection(WSDLReaderImpl.java:548)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readDocument(WSDLReaderImpl.java:438)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:377)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:627)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:605)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.readWsdlDefinition(WSDLMetadata.java:377)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.initPortsFromWsdl(WSDLMetadata.java:202)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.initPorts(WSDLMetadata.java:171)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.getPort(WSDLMetadata.java:444)  
     at oracle.j2ee.ws.common.jaxws.ServiceDelegateImpl.createDispatch(ServiceDelegateImpl.java:275)  
     at javax.xml.ws.Service.createDispatch(Service.java:352)  
     at oracle.integration.platform.blocks.soap.AbstractWebServiceBindingComponent.dispatchRequest(AbstractWebServiceBindingComponent.java:558)  
     at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.processOutboundMessage(WebServiceExternalBindingComponent.java:314)  
     at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.sendSOAPMessage(WebServiceExternalBindingComponent.java:1230)  
     at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.request(WebServiceExternalBindingComponent.java:815)  
     at oracle.integration.platform.blocks.mesh.SynchronousMessageHandler.doRequest(SynchronousMessageHandler.java:139)  
     at oracle.integration.platform.blocks.mesh.MessageRouter.request(MessageRouter.java:182)  
     at oracle.integration.platform.blocks.mesh.MeshImpl.request(MeshImpl.java:190)  
     at sun.reflect.GeneratedMethodAccessor1787.invoke(Unknown Source)  
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
     at java.lang.reflect.Method.invoke(Method.java:606)  
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)  
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)  
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)  
     at oracle.integration.platform.metrics.PhaseEventAspect.invoke(PhaseEventAspect.java:71)  
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)  
     at com.sun.proxy.$Proxy390.request(Unknown Source)  
     at oracle.fabric.CubeServiceEngine.requestToMesh(CubeServiceEngine.java:859)  
     at com.collaxa.cube.ws.WSInvocationManager.invoke(WSInvocationManager.java:279)  
     at com.collaxa.cube.engine.ext.common.InvokeHandler.__invoke(InvokeHandler.java:1131)  
     at com.collaxa.cube.engine.ext.common.InvokeHandler.handleNormalInvoke(InvokeHandler.java:626)  
     at com.collaxa.cube.engine.ext.common.InvokeHandler.handle(InvokeHandler.java:131)  
     at com.collaxa.cube.engine.ext.bpel.common.wmp.BPELInvokeWMP.__executeStatements(BPELInvokeWMP.java:74)  
     at com.collaxa.cube.engine.ext.bpel.common.wmp.BaseBPELActivityWMP.perform(BaseBPELActivityWMP.java:173)  
     at com.collaxa.cube.engine.CubeEngine.performActivity(CubeEngine.java:2721)  
     at com.collaxa.cube.engine.CubeEngine._handleWorkItem(CubeEngine.java:1197)  
     at com.collaxa.cube.engine.CubeEngine.handleWorkItem(CubeEngine.java:1100)  
     at com.collaxa.cube.engine.dispatch.message.instance.PerformMessageHandler.handleLocal(PerformMessageHandler.java:76)  
     at com.collaxa.cube.engine.dispatch.DispatchHelper.handleLocalMessage(DispatchHelper.java:251)  
     at com.collaxa.cube.engine.dispatch.DispatchHelper.sendMemory(DispatchHelper.java:330)  
     at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4653)  
     at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4584)  
     at com.collaxa.cube.engine.CubeEngine._createAndInvoke(CubeEngine.java:714)  
     at com.collaxa.cube.engine.CubeEngine.createAndInvoke(CubeEngine.java:559)  
     at com.collaxa.cube.engine.delivery.DeliveryService.handleInvoke(DeliveryService.java:535)  
     at com.collaxa.cube.engine.ejb.impl.CubeDeliveryBean.handleInvoke(CubeDeliveryBean.java:319)  
     at sun.reflect.GeneratedMethodAccessor2242.invoke(Unknown Source)  
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
     at java.lang.reflect.Method.invoke(Method.java:606)  
     at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)  
     at com.oracle.pitchfork.intercept.MethodInvocationInvocationContext.proceed(MethodInvocationInvocationContext.java:103)  
     at oracle.security.jps.ee.ejb.JpsAbsInterceptor$1.run(JpsAbsInterceptor.java:113)  
     at java.security.AccessController.doPrivileged(Native Method)  
     at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:324)  
     at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:460)  
     at oracle.security.jps.ee.ejb.JpsAbsInterceptor.runJaasMode(JpsAbsInterceptor.java:100)  
     at oracle.security.jps.ee.ejb.JpsAbsInterceptor.intercept(JpsAbsInterceptor.java:154)  
     at oracle.security.jps.ee.ejb.JpsInterceptor.intercept(JpsInterceptor.java:113)  
     at sun.reflect.GeneratedMethodAccessor1196.invoke(Unknown Source)  
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
     at java.lang.reflect.Method.invoke(Method.java:606)  
     at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)  
     at com.oracle.pitchfork.intercept.JeeInterceptorInterceptor.invoke(JeeInterceptorInterceptor.java:68)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.oracle.pitchfork.spi.MethodInvocationVisitorImpl.visit(MethodInvocationVisitorImpl.java:34)  
     at weblogic.ejb.container.injection.EnvironmentInterceptorCallbackImpl.callback(EnvironmentInterceptorCallbackImpl.java:54)  
     at com.oracle.pitchfork.spi.EnvironmentInterceptor.invoke(EnvironmentInterceptor.java:42)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)  
     at com.sun.proxy.$Proxy371.handleInvoke(Unknown Source)  
     at com.collaxa.cube.engine.ejb.impl.bpel.BPELDeliveryBean_5k948i_ICubeDeliveryLocalBeanImpl.__WL_invoke(Unknown Source)  
     at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:39)  
     at com.collaxa.cube.engine.ejb.impl.bpel.BPELDeliveryBean_5k948i_ICubeDeliveryLocalBeanImpl.handleInvoke(Unknown Source)  
     at com.collaxa.cube.engine.dispatch.message.invoke.InvokeInstanceMessageHandler.handle(InvokeInstanceMessageHandler.java:30)  
     at com.collaxa.cube.engine.dispatch.DispatchHelper.handleMessage(DispatchHelper.java:141)  
     at com.collaxa.cube.engine.dispatch.BaseDispatchTask.process(BaseDispatchTask.java:89)  
     at com.collaxa.cube.engine.dispatch.BaseDispatchTask.run(BaseDispatchTask.java:65)  
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)  
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)  
     at com.collaxa.cube.engine.dispatch.Dispatcher$ContextCapturingThreadFactory$2.run(Dispatcher.java:933)  
     at java.lang.Thread.run(Thread.java:745)  
 >  

Причина:
Не до конца завершена конфигурация HTTPS (TLS).

Вариант решения:
Необходимо добавить в параметры старта Weblogic-серверов следующие свойства:
 -Djavax.net.ssl.trustStoreType=JKS  
 -Djavax.net.ssl.trustStorePassword=XXXXX  

четверг, 11 января 2018 г.

Архитектурные принципы: разработка и проектирование

Максимально раннее тестирование

Формулировка
Разрабатываемые компоненты должны тестироваться как можно раньше и это обычно гарантирует более высокое качество.
Основная причина
Тестирование разрабатываемых компонентов должно быть включено в процесс разработки. Эта практика ведёт не только к улучшению качества компонентов, но и гарантирует поставку в срок бизнес функциональности.
Следствия/выводы
·         Разрабатываемые компоненты должны включать unit-тесты к ним;
·         Unit-тесты должны покрывать все операции компонентов.

Переиспользование

Формулировка
Архитектура, инфраструктура и дизайн должны поддерживать переиспользование активы (например, программные компоненты).
Основная причина
Переиспользование – это фундаментальный принцип, который способствует гибкости и экономии затрат. Переиспользование должно быть предусмотрено вначале проектирования и разработки.
Следствия/выводы
·         Все активы, которые могут быть переиспользованы, должны быть внесены в репозиторий для максимизации их потенциального переиспользования;
·         Архитектура должна позволять переиспользовать компоненты.

Управление изменениями

Формулировка
Изменения активов должно осуществляться контролируемым образом, что поддерживает эволюции активов и восстановление активов (если потребуется)
Основная причина
Управление изменениями – это одно из ключевых факторов в поддержке и эволюции систем. Могут появляться новые бизнес-требования, которые потребуют создание новых версий компонентов и управление ими.
Следствия/выводы
·         Все активы должны быть версионированы;
·         Оценка изменения активов должны проводиться до выполнения изменения актива;
·         Все потребители должны планировать переход на последнюю версию активов;
·         Версия кода и конфигурации не должны изменяться между окружениями.


Поставки и развёртывание компонентов

Формулировка
Компоненты должны быть собраны в поставки используя стандартные подходы с целью улучшения гибкости, переиспользования и автономного выполнения.
Основная причина
Применение автоматизированных поставок ускоряет и облегчает развёртывание, а также уменьшает влияние «человеческого фактора».
Следствия/выводы
·         Библиотеки и компоненты в поставке не должны иметь дубликаты;
·         Общие библиотеки не должны быть в составе поставки с компонентами (может быть отдельная поставки общих библиотек, которые будут использоваться многократно для поставок компонентов);
·         Любой компонент, который может быть скомпилирован должен быть скомпилирован;
·         Библиотеки платформы не должны быть в составе поставки;
·         Поставки должны соответствовать стандартам наименований и структурой принятыми у Заказчика;
·         Система должна быть протестирована на аналогичном по конфигурации промышленному окружении до развёртывания на промышленном окружении;
·         Компоненты, развёрнутые на промышленном окружении должны быть теми же, что были протестированы на тестовых окружениях. Не протестированные или частично протестированные поставки не должны разворачиваться на промышленном окружении.

вторник, 9 января 2018 г.

Архитектурные принципы: интеграция

Интеграция, базирующаяся на стандартах

Формулировка
Интеграция между системами должна базироваться на стандартах (протоколы, форматы и т.п.)
Основная причина
Интеграция, базирующаяся на стандартах, улучшает интероперабельность (т.е. способность продукта или системы, интерфейсы которых полностью открыты, взаимодействовать и функционировать с другими продуктами или системами без каких-либо ограничений доступа и реализации) не только с существующими системами, но и с системами, которые будут внедрены в будущем. Это облегчает целостное управление и мониторинг, а также увеличивает стоимость поддержки и усложняет развитие интеграции между системами.
Следствия/выводы
·         Поддержка промышленных стандартов таких как SOAP, REST, JMS, MQ и т.п.
·         При разработке избегать подхода в интеграции «точка-точка», т.к. этот подход имеет тенденцию становиться негибким и более дорогом в поддержке и развитии. См. принцип «Избегать интеграции по принципу Точка-Точка»

Логическая модель данных

Формулировка
Сообщения и форматы данных должны базироваться на логической модели бизнес объектов вместо нативных структур данных конкретных приложений
Основная причина
Основная цель сервис-ориентированной интеграции – это способствовать созданию композитных приложений. Распространение форматов данных специфичных конкретным приложениям негативно влияют на возможность композиции.
Следствия/выводы
·         Архитектура должна предоставлять возможность создания и использования логической модели данных
·         Формат данных должен базироваться на логической модели бизнес-сущностей

Нормализованные форматы данных

Формулировка
Трансформация данных «из» и «в» нормализованные форматы данных.
Основная причина
Нормализованные форматы данных способствуют композиции и снижают количество трансформаций, которые должны быть созданы и поддерживаться.
Следствия/выводы
·         Если нормализованных форматов данных нет, то они должны быть созданы;
·         Архитектура должна предоставлять возможности по трансформации данных из одного формата в другой.

Избегать интеграции по принципу Точка-Точка

Формулировка
Интеграцию по принципу Точка-Точка следует избегать
Основная причина
Интеграция по принципу Точка-Точка негибкая и более дорогая в поддержке. Хотя существуют случаи, когда интеграция по принципу Точка-Точка необходима и такие случаи нужно считать исключениями. Пример исключений включает требования к производительности, которые могут быть достигнуты используя Точка-Точка и когда передаётся большой объём данных.
Следствия/выводы
·         Архитектура должна предоставлять средства для отделения (т.е. отсутствия жесткой связи) участников интеграция;
·         Архитектура должна предоставлять механизм для передачи большого объёма данных, когда это необходимо;
·         Следует избегать интеграции по принципу Точка-Точка.

Техническая оркестровка

Формулировка
Техническая оркестровка должна быть отделена от бизнес-процессов
Основная причина
Явное разделение между техническими и бизнес аспектами способствует улучшению поддержки и развития. Технические аспекты меняются, когда происходит изменение конкретной системы, а бизнес аспекты, когда меняется бизнес-процессы.
Следствия/выводы
·         Архитектура должна поддерживать оба вида процессов (техническая оркестровка и бизнес процессы)
·         В документации (руководства) должны быть описаны различия между технической оркестровкой и бизнес-процессами, а также возможные подходы к их реализации.

Выделение бизнес-сервисов

Формулировка
Бизнес-сервисы реализовывают бизнес уровень функциональности и данных
Основная причина
Бизнес уровень функциональности и данных необходим для создания ценных для бизнеса композитных приложениям, а также возможности реализации и поддержки бизнес-процессов подготовленными бизнес пользователями. Также могут быть низкоуровневые сервисы, которые переиспользуются в бизнес-сервисах.
Следствия/выводы
·         Сервисы должны быть созданы в соответствии с слоями архитектуры;
·         При разработке сервисов должно учитываться разделение сервисов на технические и бизнес;
·         Архитектура должны поддерживать бизнес-сервисы.

Доступ через сервисы

Формулировка
Доступ к данным или функциональности должен осуществляться через сервисы.
Основная причина
Сервисы предоставляют основу для гибкой композитной разработки.
Следствия/выводы
·         Архитектура должны предоставлять механизм для доступа к данным через сервисы;
·         Архитектура должна предоставлять механизм для доступа к функциональности через сервисы.

Непрозрачная реализация сервиса

Формулировка
Реализация сервиса не должна быть прозрачной для всех потребителей сервиса.
Основная причина
Потребители сервиса должны быть в состоянии успешно вызывать сервисы без необходимости понимания внутреннего устройства вызываемого сервиса.
Следствия/выводы
·         Интерфейс сервиса должен быть создан таким образом, чтобы детали реализации не были видны через интерфейс;
·         Архитектура должны поддерживать возможность непрозрачной реализации сервисов.

Версионность сервисов

Формулировка
Может быть одновременно несколько версий сервиса в промышленной эксплуатации.
Основная причина
Как правило, сервисы изменяются для подключения новых потребителей и расширения функциональности.
Следствия/выводы
·         Должна быть описана стратегия версионирования сервисов;
·         Архитектура должна поддерживать несколько параллельных версий сервиса.


понедельник, 8 января 2018 г.

Архитектурные принципы: инфраструктура

Внешний технологический мониторинг и управление

Формулировка
Функциональность технологического мониторинга и управления должна быть внешней и не встроенной в инфраструктурный компонент
Основная причина
Встроенная в инфраструктурный компонент функциональность технологического мониторинга и управления ухудшает гибкость, а также имеет ограниченные возможности (т.е. ограничена отдельным инфраструктурным компонентом)
Следствия/выводы
·         В сервисах не должны быть жестко закодированы правила и политики управления
·         Поддержка промышленных стандартов (например, SNMP)