Show HN: Go Micro – A distributed systems development framework
go-micro.dev
go-micro.dev
Otherwise as someone who started this project 5 years ago as his first open source endeavour and was really scared about the reaction from a developer community about the quality of my software or whether there would be any interest at all, I'd hope that positive encouragement is something we advocate for rather than negativity. And I hope others are not disuaded by your comment and actively post on HN to get positive feedback on their project!
Otherwise thanks for your comment.
Oh and also now being an old man I wanted to use an account with my real name rather than a pseudonym :)
Not that I'm hating, but one of the comments above made a valid point that this part of your comment suggests is correct: maybe you should be blogging about progress of the project and gain plenty of eyeballs?
One thing I saw that fascinated me is you guys are using mDNS for discovery, I was debating this discovery approach for a small microservices foundation for D but I couldnt even find a decent library so I havent really attempted much work in that approach. I did something that in a sense feels like a micro service architecture entirely with mDNS but in Python, then months later I worked with microservices in Java and it felt so bloated and overcomplicated compared to mDNS.
IMO a culture of curiosity vs blatant promotion is an asset for this board and should be preserved. I counted at least 26 reposts of go-micro. At what frequency should we just consider it a recurring (free) ad?
On the other hand, to a large extent getting traction on HN is a somewhat random process reliant on a few high momentum votes in the early drop. A lot of the stuff we see on the front page is pushed by voting rings. Anyway given this persons hard work on a project and desire for traction, I’d rather they try/learn to market at the expense of a couple of bytes on a DB and a few scanning eyes on /new.
And it seems like this post might be their best yet :)
Although everyone has their blind spots, I certainly thought of your trivial example (pollution of /newest), and thats what I suggested is the "purpose of forum software". That is what "spam" means by the way. Writing a similar-link detection mechanism is trivial and I'm sure will be done, same way reddit has, if it's an issue. Happy to discuss any other consequences you think I'm not thinking through.
In fact the more interesting thing here is how inconsequential this thread is as it certainly wont have any bearing on the link submission culture @ HN. I'd suggest reaching out to the site admins instead of shaming the individual.
/newest is and always has been a shit show of self promotion
If you imagine the thing you will end up writing in 200-300 lines of code in your main function, we're just encapsulating in a single function for you. The thing most companies end up building, a common shared library is by any other name a framework and so we're just piecing together that common experience for everyone else.
Now the key thing to note is you can use any of these packages independently. In fact you can think of Go Micro as a standard library for distributed systems development. Its just that at the top level we import the common features and create the construct of a "Service" and give you one way to initialise it with `micro.NewService`.
But the great thing is you have the freedom of choice to use things like go-kit, go-cloud, or any of the other thousands of tools in the ecosystem :)
I think if you find value in using the pure standard library, good for you and I commend you on the effort of the not invented here syndrome. But for the rest of us it is much easier when someone else helps us out by laying the foundations for the next thing.
No project I saw, however small, uses just the standard library.
- Logging - a lack of ability to do structured logging is the main downside here.
- The `syscall` replacements - almost inevitably for larger projects it's necessary to pull in the x/sys/unix or x/sys/windows since package `syscall` was frozen.
The lack of "wrapped" errors also used to be an issue, but this has mostly been resolved with the new "%w" formatting directive to `fmt.Errorf`.
https://github.com/search?o=asc&p=4&q=language%3Ago&s=stars&...
All these run in countless production systems.
> Load Balancing - Client side load balancing built on service discovery. Once we have the addresses of any number of instances of a service we now need a way to decide which node to route to. We use random hashed load balancing to provide even distribution across the services and retry a different node if there’s a problem.
Trying to understand this a bit here. Is micro a replacement for k8s? Because I don't see any deployment capabilities here. So I'm assuming it's complementary to that. If that's the case, then I'm not sure how service discovery and load balancing would co-exist with the CNI in k8s.
In the case of k8s a lot of people swap out the load balancing for something like dns or integrate it with an envoy or linkerd considering our protocol usage is gRPC. But otherwise our service discovery acts as a central registry for all services. In a development centric environment this allows us to share feature rich metadata along with endpoints, description, and anything like team info, pager details, etc. All purely written in code rather than through yaml.
EDIT: https://github.com/micro/micro/blob/master/README.md
This page is more informative on why Micro over anything else. So I think this answers my second question.
As a contrary example, take a lot of Unix command-line tools. Things like ls and ps have very sensible defaults that cover up very complex models. Or my experience with Python's Twisted is that it is very rich, but it's simple to do simple things. And cryptography libraries are a great example of where well-chosen defaults are absolutely vital. Same with Wireguard. Is what it's up to very complex? Definitely. Do I need to understand the details to get good results? No.
On the specific thing you're talking about. Yes exactly. We want to define high level abstractions for distributed systems which are pluggable. The idea being that we can't replicate the specific complexity and absolutely phenomal work of the teams building rabbitmq, kafka, etc but we can provide abstractions on top to simplify the developer experience and make it pluggable so those who want to use rabbitmq can but those who want to use kafka can swap that out instead.
The built in broker interface at the moment focuses on lightweight pubsub, notifications and events in a way that's fire and forget moreso than delivery guarantees, queuing, offsets, etc. You can use something like kafka or rabbitmq to get these guarantees but we want to write an Event interface that will be more inline with what people expect from that requirement also.
Hope that helps!
Here's the community led Go Micro plugin effort https://github.com/micro/go-plugins
You will import plugins for rabbitmq, kafka, etc as a Go import. You can then use env vars and flags to choose which you want to use. Internally we are taking an initialiser for New[Plugin] from a list and executing it to set it up. There is no Go language plugin loading, its all still compiled code. Its just how we use the abstraction.
Please see the readme for our plugins for more detail https://github.com/micro/go-plugins
I'm pretty sure go micro's plugins are just additional packages each for its purpose ready to be imported and used in your project.
Basically a collection of community maintained packages for the most common utils\middleware\MQ clients etc
Plugins are really specific by platform combinations and support, so you're unlikely to change them much after initial launch. It's only useful if you're going from metal to cloud provider or changing the method of interaction between you API layers.
I am really interested in Go but I have a lot of learning to do before I am confident to write solutions with it.