Hi Jürgen. Ok, I missed the context of your previous mail - how modularity helps even if you have multiple containers.
I get it... It's fast to develop and easy to switch boundaries. One other thing that I have on my mind: in your example, how easy would it be to scale the billing container? I assume it would be easy to route calls at least through a load balancer (I am not at all familiar with e. g. JaxRS) I might start to consider again the whole idea of microservices and using OSGi to modularize code inside them. On Fri, May 10, 2019, 22:26 Jürgen Albert <j.alb...@data-in-motion.biz> wrote: > Hi Andrej, > > I think you got us wrong. Nobody suggested to use OSGi or Http > MIcroservices as you have called them. The Concepts behind both are > modularity. The following Definition would fit both: > > The smallest unit is a module that defines Service APIs as Interaction > points. > > Thus OSGi is the best tool to create Http Microservices. I would prefer > Distributed Microservices because you don't necessarily need HTTP for the > Communication between your containers/processes. You can split your Bundles > over as many Containers as you like and I will guarantee that is it easier > to achieve and maintain then with anything else. > > A short and every much simplyfied example to show what Todor was > describing: > > We have a small application that provides a REST API for an shop order > process. We have written the following bundles: > > rest.api -> contains the REST Resources; uses the order.api interfaces > order.api -> contains the order service interfaces > order.impl -> implementation of the order service, needs the billing.api > interface > billing.api -> contains the billing service interfaces > billing.debit -> a billing implementation for debit card payment > > Scenario A - We want everything in one JVM: > We throw this in one run configuration, let the resolver do its job, we > would end up with one Framework, containing our bundles, the JaxRS > Whiteboard, HttpWhiteboard some persistence stuff and e.g. some XML stuff > for debit provider. Export a self executable jar and of you go. Because we > can, we wrap it in a docker container to. > > Scenario B - We want the Billing stuff to run in its own process : > > We add the remote service properties to the billing service and create two > run configurations. One names the rest.api and the order.impl, the other > one contains only the billing.debit and a RSA (Remote Service Admin) > Implementation for both. Resolve both, export both to their jars, wrap them > in docker. The Service with the REST API now has the JaxRS Whiteboard, > HttpWhiteboard some persistence, the RSA and the billing.api. The other one > has only the billing.api, billing.impl, some XML Stuff and the RSA. > Congratulations, we have our first containerized microservice environment > ready. > > If you use OSGi everywhere, you will get containers that contain only what > they need and nothing else. Ideally nobody needs to write any extra REST > APIs for the internal communication. If you use OSGi Services as intended, > you will already have the API bundles with the interfaces. As a developer, > I don't necessarily need to give any thought If the service I use is a > remote or a local service. The framework does it for me. If you want to use > other languages for your containers you can even implement the RSA for them > as well and communicate with the OSGi Containers. The RSA has no java > specific part and you only need to get the serialisation compatible. > > The amount of flexibility OSGi gives you in such a scenario is priceless. > If you have developers that think modular, you will get well structured > bundles. So you can redraw the lines of you boundaries from logic to > business and back with out much risk or effort. > > I haven't found a Framework that comes even close to what I can do with > OSGi in half the time everybody else needs. > > Jürgen. > > Am 10/05/2019 um 15:50 schrieb Andrei Dulvac: > > > > On Thu, May 9, 2019 at 2:01 PM Boev, Todor <todor.b...@softwareag.com> > wrote: > >> > Others say you need to distribute based on your business domains, not >> on the low level need to share some code >> >> But neither choice has an impact on the size of the (micro-) service >> I tend to disagree. Splitting along business domains (e.g. "product >> inventory") tends to require that the microservie is a full-blown, >> self-container, three-tier web application. It implies state and storage >> and more logic to integrate with other microservices (e.g. call "user >> management" for access control). > > Right. What I meant is BOTH choices have an impact on the size of the > microservice, and you can end up with a smaller service if you split by > business domains than the boundaries of sharing code or the opposite. > > >> If you split the service by "logic reuse" you may end up with something >> like "interest calculator" - a stateless generic piece of logic with one >> rest endpoint to take input and return output. This is better off as a >> library. >> > Debatable. I personally think it's not better off as a library unless it's > "complete" and I won't have to change it whenever I change my services. If > I introduce new functionality and dimensions to my service and start > differentiating offerings to my customers by e.g. age, i'd have to change > the library and update it in all my services. > If it's just applying a generic mathematical function (based on literature > and with no ties to my business domain), of course it should be a library. > Classic example is calendar or date libraries, where we should all use an > open-source library, everywhere :) > > >> >> So "well designed" microservies actually include a lot of stuff which in >> turn makes OSGi more attractive: rest sever, rest client, db access, sso, >> component runtime to integrate all of this... What people tend to do is to >> pick a set of these things they feel are generic enough, call it "the >> platform" or "the microservice chassis" and pay the cost of having it >> everywhere. Think of "MicroProfile" - it's a fixed set of things and try as >> they might to keep the list small it inevitably will bloat up with every >> subsequent release >> > >> OSGi gives you a way out. The "platform" is actually a shared bundle >> repository and the OSGi build will put together for you exactly the pieces >> you need in each microservice. Then because each bundle is an independent >> unit with its own lifecycle they snap together just by being loaded into >> the OSGi runtime. If you try to escape the "platform syndrome" with plain >> maven for example you may be forced to provide the glue code yourself since >> outside OSGi code tends to be shared as libraries with the expectation that >> the user of the library will drive it's lifecycle. If you notice service >> dynamics are not used in this scenario yet they are an important tool to >> enable the bundles to hook together even though this happens only once at >> startup. >> > > I fully accept your analysis of how OSGi gives you a lot of what http > microservices designs give you. Like "each bundle is an independent unit > with its own lifecycle". But it doesn't reach the same level of decoupling > like doing them with separate processes. If you run microservices in > separate processes, you can rewrite some of them in a different language, > you can move one microservice in a different network, and, most > importantly, you can scale them horizontally (maybe elastically) beyond > what you could do in an OSGi instance > >> >> In short you are right that for simple enough microservices plain maven >> and plain jars are simpler. However I believe this gets out of hand very >> quickly simply because the correct way to design microserviecs puts the bar >> of functionality (and footprint) pretty high. >> > > I agree, but I still stand beside my statement that OSGi would be limited > in terms of decoupling and scalability, compared to what you could do with > separate process, if you get it right. And yes, huge footprint and overhead > (and risk) of defining APIs differently (like "REST APIs"), code > duplication. But in some situations (If you're Netflix or Uber), you might > trade that off for the extra bit that you don't get with OSGi. > >> >> As an example I have built a microservice with REST, JDBC, SSO through >> JWT and some hello-world business logic in ~10 mb (the JVM excluded). >> Another microservie did not need the JDBC so it was ~8 MB. What came into >> the image was driven almost entirely by the requirements of my business >> code out of a common bundle repository. >> >> Regards >> ----------------------------------- >> Todor Boev >> OSGi Platform >> Software AG >> >> From: Andrei Dulvac [mailto:dul...@apache.org] >> Sent: Monday, May 6, 2019 6:21 PM >> To: Boev, Todor; OSGi Developer Mail List >> Cc: Jürgen Albert; SMAIL LOUNES >> Subject: Re: [osgi-dev] Migrating from OSGI to Microservices >> >> This is a great and coherent answer and it made me think a lot. >> > Others say you need to distribute based on your business domains, not >> on the low level need to share some code. >> >> But neither choice has an impact on the size of the (micro-) service >> >> > So microservice modularity runs orthogonally to in-process modularity. >> Indeed you need efficient in-process modularity to build good microservces. >> >> What I meant when I said there's an overlap it's the modularisation part. >> Yes, with OSGi you can and might want to modularise your service further, >> but if you're going through the infra and ops cost of maintaining and >> deploying microservices, you can split down a larger service further into >> two microservices (if performance and the arch permits). >> And if your services are quite split already, how much benefits do the >> extra in-process modularisation bring you? >> >> Don't get me wrong, I love OSGi and, on top of that, I think it's >> actually a better way to start a project from a green field and make use of >> that modularisation. So start with a monolith in that strict sense (as you >> don't have the scalability part). And when you need all the advantages of >> microservices in the strict sense, your service is already modular (*) and >> you can just take out the part that needs to scale and make it a separate >> service that you can scale independently. >> >> A wise man once told me: "You will never get the architecture and domain >> boundaries right from the start with microservices" >> >> (*) As long as you future-proof a bit and don't make an architecture that >> assumes blindly that osgi services are sharing the process with other >> services. >> >> - Andrei >> >> >> >> On Fri, May 3, 2019 at 5:32 PM Boev, Todor via osgi-dev < >> osgi-dev@mail.osgi.org> wrote: >> I work on tools build OSGi-based microservices for the likes of K8S. By >> extension this includes thinking/experimenting to discover whether/how OSGi >> is applicable in these environments. >> >> One thing I noticed is that when you have a distributed application all >> of its pieces must coordinate their internal lifecycles across the network. >> This is more in the realm of communication between the microservices, >> rather than in the realm of deploying containers. For example K8S can >> maintain replicas of your containers, but this is for scalability rather >> than to create the illusion network calls can’t fail. The application >> running on top is expected to adapt on the fly. You really need good >> programming models. >> >> OSGi provides one elegant programming model. You already have services >> that coordinate their independent dynamic lifecycles. If you model an >> external entity as a service (e.g. a remote client object) you can hook >> your application internal state directly to it. Then use discovery to >> distribute knowledge when things are coming/going/relocating and have the >> distributed system keep itself in balance while K8S takes care of >> responding to load – it is a good fit. >> >> The other thing I have noticed is the inclination to think of >> microservices as a universal modularity solution. People brag about having >> hundreds of services with some consisting of one function. To share this >> one piece of code you seem to pay the cost of handling distribution, >> memory/cpu/network to maintain extra processes. This ultimately translates >> to paying raw money. While Martin Fawler promotes modularity through >> microservices he explicitly does not say where to stop if I remember >> correctly. Others say you need to distribute based on your business >> domains, not on the low level need to share some code. So microservice >> modularity runs orthogonally to in-process modularity. Indeed you need >> efficient in-process modularity to build good microservces. >> >> Here again OSGi can be a compelling solution since it tends to build >> really small footprint images, because it has deep understanding what each >> jar needs. This does not come for free – you need to describe your code >> well in the module metadata. >> >> The third thing I noticed is that it only really works well when you use >> simple/light OSGi components. Use http whiteboard, not web bundles. Use >> declarative services, not blueprint. And so on. Even if you use >> “traditional” distribution without the dynamic lifecycle it is still quite >> fun and OSGi has a lot to offer (e.g. JAX-RS whiteboard). >> >> So in general if you choose a microservice architecture and choose to >> build immutable small containers you are not at odds with OSGi. It actually >> can help. If you already have an OSGi application you can consider it a >> head start. You will have to refactor a lot to split your business logic >> into independent services, but you won’t refactor less if you were not OSGi >> based. >> Mohamed however mentioned he’d like to use ready-made solutions to >> implement application features and has issues with OSGi in that respect. >> What are they? >> OSGi can provide means to structure distributed applications, but it sure >> can’t provide an independent analog of every heavy-lifting framework out >> there. >> ----------------------------------- >> Todor Boev >> OSGi Platform >> Software AG >> >> From: osgi-dev-boun...@mail.osgi.org [mailto: >> osgi-dev-boun...@mail.osgi.org] On Behalf Of Jurgen Albert via osgi-dev >> Sent: Friday, May 3, 2019 3:41 PM >> To: SMAIL LOUNES; OSGi Developer Mail List >> Subject: Re: [osgi-dev] Migrating from OSGI to Microservices >> >> Well, like I said: Kubernetes only knows and cares about Containers >> (Pods) and nothing about any application life cycle. You can define e.g. >> dependencies like an application container requires a container with a DB. >> So when someone triggers the start of your application container it will >> make sure that the DB container is started and as far as I remember will >> set the coordinates to the DB as system properties for you. However, It >> will not know the state of readyness of your application or the DB. As an >> example, we have search server tailor maid for one of our customers. On >> first start it rebuilds the index from the raw data in their DB. This can >> take a couple of minutes. For Kubernetes the container is up and running, >> but the server will not be available to answer queries until the index is >> ready. >> >> Thus, if you want to use the Kubernetes API to start a Pod for a specific >> services it you can do that, but everything else is not in its scope. It is >> just a convenient tool to manage an Infrastructure. The rest belongs to >> your application domain. >> >> Regards, >> >> Jürgen. >> >> Am 03/05/2019 um 14:16 schrieb SMAIL LOUNES: >> Thank you for this remarkable answer, >> I'm working on a research project about developping a highly distributed >> and dynamic communication platform, so we're looknig for using kubernetes >> to manage µservices life cycle, osgi is a condidate too. we can use an osgi >> container to deploy some µservices.. do you have an idea about using >> kubernetes for life cycle mangement and how integrate it's API >> >> Thank you so much, Best regards >> >> Le ven. 3 mai 2019 à 12:25, Jürgen Albert via osgi-dev < >> osgi-dev@mail.osgi.org> a écrit : >> Hi Mohamed, >> >> I had the fortune and in parts misfortune of being part of a few such >> migration projects. Besides our own internal one, everyone decided against >> OSGi. The descension was always because of personal resentment and/or >> because everybody had his personal favourite toy they wanted to play with. >> The reasons ranged from " We don't want to use Eclipse" (enroute with >> maven wasn't available at the time) over "We want spring because we don't >> understand OSGi and it seems to complicated" to " Java is outdated, we want >> to build it with NodeJS". They all jumped on the Martin Fowler approach >> without really considering what it means in the end. Each ended in disaster >> or went through a hard phase of near disaster with jobs and reputations on >> the line. Most ended up with something OSGiish with a lot of the pain going >> along with modularity but missing most of its benefits. >> >> The issue is complex but we Identified one main reason: >> >> Modularity is an abstract concept for many developers. Spring for example >> does not really teach and force a developer to think in a modular fashion. >> All I saw was a bunch of smaller Monoliths packed in Docker containers. The >> dynamic nature of a Microservice environment OSGi addresses with its Bundle >> and Service life cycle , was pushed in the realm of Kubernetes. But >> Kubernetes (or comparable Systems) is made for managing your Containers and >> not for any application and service life cycle. Thus one needs at least a >> few Developers/Architects that have modularity internalised and address >> issues early on. >> >> Another issue with the Martin Fowler approach you have already addressed. >> A fully distributed system comes with a lot of different problems (e.g. >> caches). Also the point of network latency and the time serialization and >> deserialization is an underestimated issue. >> >> Like Neil stated: If you are already have an OSGi application you already >> have a microservice architecture, but maybe no distributed one. The way to >> go is build a good microservice monolith (or modulith, like it is called >> nowadays) and then move only the services to there own containers, that >> really need scaling. Graham Charters talk from the 2016 EclipseCon Europe >> addresses this quite nicely: >> https://de.slideshare.net/mfrancis/microservices-osgi-better-together-graham-charters >> >> By your mention of blueprint, I deduct that you might use an older >> version of OSGi. Our internal project was somewhat similar and we managed >> to go distributed without major problems. We migrated to the latest OSGi >> Version and used bnd instead of PDE. Later we moved some service to there >> own container. It worked like charm. We could even show the process to a >> customer, with zero downtime, by pulling up the new containers and removing >> bundles with the local service implementations while the system was running. >> >> Regarding your point of finding/keep OSGi developers: This is something >> we are confronted with rather often. The best way get developers sold on >> OSGi is using the latest version of it together with bnd (pure or with the >> maven integration). The development speed you can reach and maintain even >> in complex applications makes most other Java developers jealous and >> interested to learn more. >> Regards, >> Jürgen. >> >> Am 03/05/2019 um 10:57 schrieb Mohamed AFIF via osgi-dev: >> Hi Andrei, >> My question had as aim to collect some experiences of suchs migrations if >> this exist, we're in brainstorming phase and I'm not making any judgement >> value about OSGI or microservices architecture, but what we push to >> believe that we should probely move toward another technology, is: the >> business requirement, indeed we want to expose our service to clients as >> API, and the several technical complications we 've ve been faced to >> everytime we want to implement a feature easily provided and could be >> implemented by other open framework in the market, there is also the Human >> ressource question is involved beacause it's not easy find/keep OSGI >> developers. >> personaly I think that OSGI is a perfect tehcnology for servers or >> embedded system, but I've some doubt when it's regarding applications with >> open architectures, it's my own view and I could be wrong >> >> Regards >> >> Mohamed. >> >> >> >> >> >> >> >> >> @Neil >> Obviously a simple >> >> >> >> Le jeu. 2 mai 2019 à 16:52, Andrei Dulvac <dul...@apache.org> a écrit : >> Hi Mohamed, Neil. >> >> Neil, while I agree with you, I think Mohamed means it in the more >> "modern", widely-accepted sense: >> https://martinfowler.com/articles/microservices.html >> >> """ >> In short, the microservice architectural style [1] is an approach to >> developing a single application as a suite of small services, each running >> in its own process and communicating with lightweight mechanisms, often an >> HTTP resource API. >> """ >> >> Mohamed, I'm curious what you end up with. Without getting too much into >> it, I dismissed the idea as something "not worth it". >> >> - Andrei >> >> On Thu, May 2, 2019 at 12:37 PM Neil Bartlett via osgi-dev < >> osgi-dev@mail.osgi.org> wrote: >> Well the good news is that OSGi is already a microservice architecture, >> so you have already finished. Congratulations! >> >> If that answer doesn't quite satisfy you, maybe you'd like to describe in >> more detail what you are attempting to achieve and why? >> >> Regards, >> Neil >> >> On Thu, 2 May 2019 at 11:06, Mohamed AFIF via osgi-dev < >> osgi-dev@mail.osgi.org> wrote: >> Hello everybody, >> >> We 're starting to study the possibility to transform our architcteure in >> order to migrate from OSGI to microservice architecture, and I would like >> to know if there is alreay some people who had thought about this subject >> or already start this migration. >> Because at first sight it would not be an easy task, many problems/issues >> we will be facing to them (blueprint injections, managing ditrubued caches >> instead of one cache in one JVM...) >> >> Many thanks >> >> >> >> >> -- >> >> Cdt >> Mohamed AFIF >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> >> >> >> -- >> >> Cdt >> Mohamed AFIF >> >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> >> -- >> Jürgen Albert >> Geschäftsführer >> >> Data In Motion Consulting GmbH >> >> Kahlaische Str. 4 >> 07745 Jena >> >> Mobil: 0157-72521634 >> E-Mail: j.alb...@datainmotion.de >> Web: www.datainmotion.de >> >> XING: https://www.xing.com/profile/Juergen_Albert5 >> >> Rechtliches >> >> Jena HBR 513025 >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> >> >> -- >> >> >> -- >> Jürgen Albert >> Geschäftsführer >> >> Data In Motion Consulting GmbH >> >> Kahlaische Str. 4 >> 07745 Jena >> >> Mobil: 0157-72521634 >> E-Mail: j.alb...@datainmotion.de >> Web: www.datainmotion.de >> >> XING: https://www.xing.com/profile/Juergen_Albert5 >> >> Rechtliches >> >> Jena HBR 513025 >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev >> > > -- > Jürgen Albert > Geschäftsführer > > Data In Motion Consulting GmbH > > Kahlaische Str. 4 > 07745 Jena > > Mobil: 0157-72521634 > E-Mail: j.alb...@datainmotion.de > Web: www.datainmotion.de > > XING: https://www.xing.com/profile/Juergen_Albert5 > > Rechtliches > > Jena HBR 513025 > >
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev