Semaphore is a feature-rich service orchestrator. Create advanced data flows and expose them through endpoints. Have full control over your exposed endpoints, expose single flows for multiple protocols such as gRPC and GraphQL. Semaphore adapts to your environment. Create custom extensions or use the availability of custom functions and protocol implementations.
Semaphore integrates with your existing system(s). Define flows through simple and strict typed definitions. Use your already existing schema definitions such as Protobuffers. Or extend Semaphore with custom modules and proprietary software. Integrate services through flow definitions and create a great experience for your customers and your teams.
Semaphore could be used in a wide variety of cases. It could be used to let teams have full control over their exposed endpoints. Create SAGA patterns to automatically rollback requests on failure. Allow users to implement your product with their tools of choice. We are excited to see how you will implement Semaphore in your architecture.
-
Gateway: Semaphore redefines the gateway. Expose a single flow through multiple protocols without changing any of your services.
-
Scalable: You can scale Semaphore up to your needs. All calls within a flow are executed in the most optimal path possible. Branches are created to execute calls concurrently from one another when possible.
-
SAGA patterns: Define rollbacks inside your flows in the case of failure. Rollbacks are automatically executed if a request fails. Rollbacks could reference data received from other services.
-
E2E testing: Expose your internal e2e tests through any protocol. Deploy a Semaphore instance to expose internal endpoints without exposing them to the public.
There are variouse install methods available. You could download and install the daemon from source or most commonly used package managers. For more information and install methods please check out the CLI.
$ curl https://raw.githubusercontent.com/jexia/semaphore/master/install.sh | sh
Data streams inside Semaphore are defined as flows. A flow could manipulate, deconstruct and forwarded data in between calls and services. Flows are exposed through endpoints. Flows are generic and could handle different protocols and codecs within a single flow. All flows are strictly typed through schema definitions. These schemas define the contracts provided and accepted by services.
endpoint "checkout" "http" {
method = "POST"
endpoint = "/checkout"
codec = "json"
}
endpoint "checkout" "grpc" {
package = "webshop.cart"
service = "Payment"
method = "Checkout"
}
flow "checkout" {
input "services.Order" {}
resource "product" {
request "services.Warehouse" "GetProduct" {
product = "{{ input:product }}"
}
}
resource "shipping" {
request "services.Warehouse" "Send" {
user = "{{ input:user }}"
}
}
output "services.OrderResult" {
status = "{{ shipping:status }}"
message "product" {
id = "{{ product:id }}"
name = "{{ product:name }}"
price = "{{ product:price }}"
}
}
}
Thank you for your interest in contributing to Semaphore! ❤ Check out the open projects and/or issues and feel free to join any ongoing discussion.
Everyone is welcome to contribute, whether it's in the form of code, documentation, bug reports, feature requests, or anything else. We encourage you to experiment with the project and make contributions to help evolve it to meet your needs!
See the contributing guide for more details.