Open Service Mesh (OSM) is a lightweight, extensible, Cloud Native service mesh that allows users to uniformly manage, secure, and get out-of-the-box observability features for highly dynamic microservice environments.
Project Setup and Dependencies
1. Maven Dependencies
<dependencies> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>3.1.0</version> </dependency> <!-- Kubernetes Client --> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>18.0.0</version> </dependency> <!-- OpenTelemetry for Distributed Tracing --> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.28.0</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> <version>1.28.0</version> </dependency> <!-- Resilience4j for Circuit Breaker --> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot3</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-circuitbreaker</artifactId> <version>2.0.2</version> </dependency> <!-- Micrometer for Metrics --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.11.5</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.11.5</version> </dependency> <!-- HTTP Client --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>3.1.0</version> </dependency> <!-- JSON Processing --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> <!-- Testing --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>3.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java-spring-integration</artifactId> <version>18.0.0</version> <scope>test</scope> </dependency> </dependencies>
OSM Configuration and Models
1. OSM Configuration Classes
// OsmConfig.java
package com.company.osm.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
@Configuration
@ConfigurationProperties(prefix = "osm")
public class OsmConfig {
private boolean enabled = true;
private String namespace = "osm-system";
private String meshName = "osm";
private TrafficConfig traffic = new TrafficConfig();
private SecurityConfig security = new SecurityConfig();
private ObservabilityConfig observability = new ObservabilityConfig();
// Getters and setters
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
public String getNamespace() { return namespace; }
public void setNamespace(String namespace) { this.namespace = namespace; }
public String getMeshName() { return meshName; }
public void setMeshName(String meshName) { this.meshName = meshName; }
public TrafficConfig getTraffic() { return traffic; }
public void setTraffic(TrafficConfig traffic) { this.traffic = traffic; }
public SecurityConfig getSecurity() { return security; }
public void setSecurity(SecurityConfig security) { this.security = security; }
public ObservabilityConfig getObservability() { return observability; }
public void setObservability(ObservabilityConfig observability) { this.observability = observability; }
public static class TrafficConfig {
private boolean enablePermissiveTrafficPolicy = true;
private boolean enableEgress = true;
private boolean enableIngress = true;
private String trafficInterceptionMode = "iptables";
private Map<String, String> outboundIPRangeExclusionList;
// Getters and setters
public boolean isEnablePermissiveTrafficPolicy() { return enablePermissiveTrafficPolicy; }
public void setEnablePermissiveTrafficPolicy(boolean enablePermissiveTrafficPolicy) { this.enablePermissiveTrafficPolicy = enablePermissiveTrafficPolicy; }
public boolean isEnableEgress() { return enableEgress; }
public void setEnableEgress(boolean enableEgress) { this.enableEgress = enableEgress; }
public boolean isEnableIngress() { return enableIngress; }
public void setEnableIngress(boolean enableIngress) { this.enableIngress = enableIngress; }
public String getTrafficInterceptionMode() { return trafficInterceptionMode; }
public void setTrafficInterceptionMode(String trafficInterceptionMode) { this.trafficInterceptionMode = trafficInterceptionMode; }
public Map<String, String> getOutboundIPRangeExclusionList() { return outboundIPRangeExclusionList; }
public void setOutboundIPRangeExclusionList(Map<String, String> outboundIPRangeExclusionList) { this.outboundIPRangeExclusionList = outboundIPRangeExclusionList; }
}
public static class SecurityConfig {
private boolean enableMutualTLS = true;
private boolean enableCertManager = true;
private String certManagerIssuer = "osm-ca";
private boolean enableEnvoySidecar = true;
private Map<String, String> tlsMinProtocolVersion;
// Getters and setters
public boolean isEnableMutualTLS() { return enableMutualTLS; }
public void setEnableMutualTLS(boolean enableMutualTLS) { this.enableMutualTLS = enableMutualTLS; }
public boolean isEnableCertManager() { return enableCertManager; }
public void setEnableCertManager(boolean enableCertManager) { this.enableCertManager = enableCertManager; }
public String getCertManagerIssuer() { return certManagerIssuer; }
public void setCertManagerIssuer(String certManagerIssuer) { this.certManagerIssuer = certManagerIssuer; }
public boolean isEnableEnvoySidecar() { return enableEnvoySidecar; }
public void setEnableEnvoySidecar(boolean enableEnvoySidecar) { this.enableEnvoySidecar = enableEnvoySidecar; }
public Map<String, String> getTlsMinProtocolVersion() { return tlsMinProtocolVersion; }
public void setTlsMinProtocolVersion(Map<String, String> tlsMinProtocolVersion) { this.tlsMinProtocolVersion = tlsMinProtocolVersion; }
}
public static class ObservabilityConfig {
private boolean enableMetrics = true;
private boolean enableTracing = true;
private boolean enableAccessLogs = true;
private String tracingEndpoint = "jaeger.osm-system:9411";
private String metricsBackend = "prometheus";
// Getters and setters
public boolean isEnableMetrics() { return enableMetrics; }
public void setEnableMetrics(boolean enableMetrics) { this.enableMetrics = enableMetrics; }
public boolean isEnableTracing() { return enableTracing; }
public void setEnableTracing(boolean enableTracing) { this.enableTracing = enableTracing; }
public boolean isEnableAccessLogs() { return enableAccessLogs; }
public void setEnableAccessLogs(boolean enableAccessLogs) { this.enableAccessLogs = enableAccessLogs; }
public String getTracingEndpoint() { return tracingEndpoint; }
public void setTracingEndpoint(String tracingEndpoint) { this.tracingEndpoint = tracingEndpoint; }
public String getMetricsBackend() { return metricsBackend; }
public void setMetricsBackend(String metricsBackend) { this.metricsBackend = metricsBackend; }
}
}
// ServiceMeshConfig.java
package com.company.osm.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "service-mesh")
public class ServiceMeshConfig {
private String serviceAccountName;
private String namespace;
private Map<String, String> labels;
private Map<String, String> annotations;
private CircuitBreakerConfig circuitBreaker = new CircuitBreakerConfig();
private RetryConfig retry = new RetryConfig();
private TimeoutConfig timeout = new TimeoutConfig();
// Getters and setters
public String getServiceAccountName() { return serviceAccountName; }
public void setServiceAccountName(String serviceAccountName) { this.serviceAccountName = serviceAccountName; }
public String getNamespace() { return namespace; }
public void setNamespace(String namespace) { this.namespace = namespace; }
public Map<String, String> getLabels() { return labels; }
public void setLabels(Map<String, String> labels) { this.labels = labels; }
public Map<String, String> getAnnotations() { return annotations; }
public void setAnnotations(Map<String, String> annotations) { this.annotations = annotations; }
public CircuitBreakerConfig getCircuitBreaker() { return circuitBreaker; }
public void setCircuitBreaker(CircuitBreakerConfig circuitBreaker) { this.circuitBreaker = circuitBreaker; }
public RetryConfig getRetry() { return retry; }
public void setRetry(RetryConfig retry) { this.retry = retry; }
public TimeoutConfig getTimeout() { return timeout; }
public void setTimeout(TimeoutConfig timeout) { this.timeout = timeout; }
public static class CircuitBreakerConfig {
private boolean enabled = true;
private int failureRateThreshold = 50;
private int slowCallRateThreshold = 100;
private int slowCallDurationThreshold = 60000;
private int permittedNumberOfCallsInHalfOpenState = 10;
private int slidingWindowSize = 100;
private int minimumNumberOfCalls = 100;
private int waitDurationInOpenState = 60000;
// Getters and setters
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
public int getFailureRateThreshold() { return failureRateThreshold; }
public void setFailureRateThreshold(int failureRateThreshold) { this.failureRateThreshold = failureRateThreshold; }
public int getSlowCallRateThreshold() { return slowCallRateThreshold; }
public void setSlowCallRateThreshold(int slowCallRateThreshold) { this.slowCallRateThreshold = slowCallRateThreshold; }
public int getSlowCallDurationThreshold() { return slowCallDurationThreshold; }
public void setSlowCallDurationThreshold(int slowCallDurationThreshold) { this.slowCallDurationThreshold = slowCallDurationThreshold; }
public int getPermittedNumberOfCallsInHalfOpenState() { return permittedNumberOfCallsInHalfOpenState; }
public void setPermittedNumberOfCallsInHalfOpenState(int permittedNumberOfCallsInHalfOpenState) { this.permittedNumberOfCallsInHalfOpenState = permittedNumberOfCallsInHalfOpenState; }
public int getSlidingWindowSize() { return slidingWindowSize; }
public void setSlidingWindowSize(int slidingWindowSize) { this.slidingWindowSize = slidingWindowSize; }
public int getMinimumNumberOfCalls() { return minimumNumberOfCalls; }
public void setMinimumNumberOfCalls(int minimumNumberOfCalls) { this.minimumNumberOfCalls = minimumNumberOfCalls; }
public int getWaitDurationInOpenState() { return waitDurationInOpenState; }
public void setWaitDurationInOpenState(int waitDurationInOpenState) { this.waitDurationInOpenState = waitDurationInOpenState; }
}
public static class RetryConfig {
private boolean enabled = true;
private int maxAttempts = 3;
private long waitDuration = 1000;
private String retryOnStatusCodes = "500,502,503";
// Getters and setters
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
public int getMaxAttempts() { return maxAttempts; }
public void setMaxAttempts(int maxAttempts) { this.maxAttempts = maxAttempts; }
public long getWaitDuration() { return waitDuration; }
public void setWaitDuration(long waitDuration) { this.waitDuration = waitDuration; }
public String getRetryOnStatusCodes() { return retryOnStatusCodes; }
public void setRetryOnStatusCodes(String retryOnStatusCodes) { this.retryOnStatusCodes = retryOnStatusCodes; }
}
public static class TimeoutConfig {
private boolean enabled = true;
private long globalTimeout = 30000;
private Map<String, Long> serviceTimeouts;
// Getters and setters
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
public long getGlobalTimeout() { return globalTimeout; }
public void setGlobalTimeout(long globalTimeout) { this.globalTimeout = globalTimeout; }
public Map<String, Long> getServiceTimeouts() { return serviceTimeouts; }
public void setServiceTimeouts(Map<String, Long> serviceTimeouts) { this.serviceTimeouts = serviceTimeouts; }
}
}
2. OSM Resource Models
// MeshConfig.java
package com.company.osm.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import java.util.Map;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MeshConfig {
@JsonProperty("apiVersion")
private String apiVersion = "config.openservicemesh.io/v1alpha1";
@JsonProperty("kind")
private String kind = "MeshConfig";
@JsonProperty("metadata")
private Metadata metadata;
@JsonProperty("spec")
private Spec spec;
// Getters and setters
public String getApiVersion() { return apiVersion; }
public void setApiVersion(String apiVersion) { this.apiVersion = apiVersion; }
public String getKind() { return kind; }
public void setKind(String kind) { this.kind = kind; }
public Metadata getMetadata() { return metadata; }
public void setMetadata(Metadata metadata) { this.metadata = metadata; }
public Spec getSpec() { return spec; }
public void setSpec(Spec spec) { this.spec = spec; }
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Metadata {
private String name;
private String namespace;
private Map<String, String> labels;
private Map<String, String> annotations;
// Getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getNamespace() { return namespace; }
public void setNamespace(String namespace) { this.namespace = namespace; }
public Map<String, String> getLabels() { return labels; }
public void setLabels(Map<String, String> labels) { this.labels = labels; }
public Map<String, String> getAnnotations() { return annotations; }
public void setAnnotations(Map<String, String> annotations) { this.annotations = annotations; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Spec {
private Traffic traffic;
private Observability observability;
private Certificate certificate;
private FeatureFlags featureFlags;
// Getters and setters
public Traffic getTraffic() { return traffic; }
public void setTraffic(Traffic traffic) { this.traffic = traffic; }
public Observability getObservability() { return observability; }
public void setObservability(Observability observability) { this.observability = observability; }
public Certificate getCertificate() { return certificate; }
public void setCertificate(Certificate certificate) { this.certificate = certificate; }
public FeatureFlags getFeatureFlags() { return featureFlags; }
public void setFeatureFlags(FeatureFlags featureFlags) { this.featureFlags = featureFlags; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Traffic {
private Boolean enableEgress;
private Boolean enablePermissiveTrafficPolicy;
private String trafficInterceptionMode;
private List<String> outboundIPRangeExclusionList;
private InboundPortExclusionList inboundPortExclusionList;
private OutboundPortExclusionList outboundPortExclusionList;
// Getters and setters
public Boolean getEnableEgress() { return enableEgress; }
public void setEnableEgress(Boolean enableEgress) { this.enableEgress = enableEgress; }
public Boolean getEnablePermissiveTrafficPolicy() { return enablePermissiveTrafficPolicy; }
public void setEnablePermissiveTrafficPolicy(Boolean enablePermissiveTrafficPolicy) { this.enablePermissiveTrafficPolicy = enablePermissiveTrafficPolicy; }
public String getTrafficInterceptionMode() { return trafficInterceptionMode; }
public void setTrafficInterceptionMode(String trafficInterceptionMode) { this.trafficInterceptionMode = trafficInterceptionMode; }
public List<String> getOutboundIPRangeExclusionList() { return outboundIPRangeExclusionList; }
public void setOutboundIPRangeExclusionList(List<String> outboundIPRangeExclusionList) { this.outboundIPRangeExclusionList = outboundIPRangeExclusionList; }
public InboundPortExclusionList getInboundPortExclusionList() { return inboundPortExclusionList; }
public void setInboundPortExclusionList(InboundPortExclusionList inboundPortExclusionList) { this.inboundPortExclusionList = inboundPortExclusionList; }
public OutboundPortExclusionList getOutboundPortExclusionList() { return outboundPortExclusionList; }
public void setOutboundPortExclusionList(OutboundPortExclusionList outboundPortExclusionList) { this.outboundPortExclusionList = outboundPortExclusionList; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Observability {
private Boolean enableDebugServer;
private String tracingAddress;
private Integer tracingPort;
private String tracingEndpoint;
private Boolean enableAccessLogs;
// Getters and setters
public Boolean getEnableDebugServer() { return enableDebugServer; }
public void setEnableDebugServer(Boolean enableDebugServer) { this.enableDebugServer = enableDebugServer; }
public String getTracingAddress() { return tracingAddress; }
public void setTracingAddress(String tracingAddress) { this.tracingAddress = tracingAddress; }
public Integer getTracingPort() { return tracingPort; }
public void setTracingPort(Integer tracingPort) { this.tracingPort = tracingPort; }
public String getTracingEndpoint() { return tracingEndpoint; }
public void setTracingEndpoint(String tracingEndpoint) { this.tracingEndpoint = tracingEndpoint; }
public Boolean getEnableAccessLogs() { return enableAccessLogs; }
public void setEnableAccessLogs(Boolean enableAccessLogs) { this.enableAccessLogs = enableAccessLogs; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Certificate {
private String serviceCertValidityDuration;
private String certKeyBitSize;
private String ingressGateway;
// Getters and setters
public String getServiceCertValidityDuration() { return serviceCertValidityDuration; }
public void setServiceCertValidityDuration(String serviceCertValidityDuration) { this.serviceCertValidityDuration = serviceCertValidityDuration; }
public String getCertKeyBitSize() { return certKeyBitSize; }
public void setCertKeyBitSize(String certKeyBitSize) { this.certKeyBitSize = certKeyBitSize; }
public String getIngressGateway() { return ingressGateway; }
public void setIngressGateway(String ingressGateway) { this.ingressGateway = ingressGateway; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class FeatureFlags {
private Boolean enableWASMStats;
private Boolean enableEgressPolicy;
private Boolean enableMulticlusterMode;
private Boolean enableAsyncProxy;
// Getters and setters
public Boolean getEnableWASMStats() { return enableWASMStats; }
public void setEnableWASMStats(Boolean enableWASMStats) { this.enableWASMStats = enableWASMStats; }
public Boolean getEnableEgressPolicy() { return enableEgressPolicy; }
public void setEnableEgressPolicy(Boolean enableEgressPolicy) { this.enableEgressPolicy = enableEgressPolicy; }
public Boolean getEnableMulticlusterMode() { return enableMulticlusterMode; }
public void setEnableMulticlusterMode(Boolean enableMulticlusterMode) { this.enableMulticlusterMode = enableMulticlusterMode; }
public Boolean getEnableAsyncProxy() { return enableAsyncProxy; }
public void setEnableAsyncProxy(Boolean enableAsyncProxy) { this.enableAsyncProxy = enableAsyncProxy; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class InboundPortExclusionList {
private List<Integer> ports;
private List<String> protocols;
// Getters and setters
public List<Integer> getPorts() { return ports; }
public void setPorts(List<Integer> ports) { this.ports = ports; }
public List<String> getProtocols() { return protocols; }
public void setProtocols(List<String> protocols) { this.protocols = protocols; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class OutboundPortExclusionList {
private List<Integer> ports;
private List<String> protocols;
// Getters and setters
public List<Integer> getPorts() { return ports; }
public void setPorts(List<Integer> ports) { this.ports = ports; }
public List<String> getProtocols() { return protocols; }
public void setProtocols(List<String> protocols) { this.protocols = protocols; }
}
}
// TrafficTarget.java
package com.company.osm.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TrafficTarget {
@JsonProperty("apiVersion")
private String apiVersion = "access.smi-spec.io/v1alpha3";
@JsonProperty("kind")
private String kind = "TrafficTarget";
@JsonProperty("metadata")
private MeshConfig.Metadata metadata;
@JsonProperty("spec")
private TrafficTargetSpec spec;
// Getters and setters
public String getApiVersion() { return apiVersion; }
public void setApiVersion(String apiVersion) { this.apiVersion = apiVersion; }
public String getKind() { return kind; }
public void setKind(String kind) { this.kind = kind; }
public MeshConfig.Metadata getMetadata() { return metadata; }
public void setMetadata(MeshConfig.Metadata metadata) { this.metadata = metadata; }
public TrafficTargetSpec getSpec() { return spec; }
public void setSpec(TrafficTargetSpec spec) { this.spec = spec; }
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class TrafficTargetSpec {
private Destination destination;
private List<Source> sources;
private List<Rule> rules;
// Getters and setters
public Destination getDestination() { return destination; }
public void setDestination(Destination destination) { this.destination = destination; }
public List<Source> getSources() { return sources; }
public void setSources(List<Source> sources) { this.sources = sources; }
public List<Rule> getRules() { return rules; }
public void setRules(List<Rule> rules) { this.rules = rules; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Destination {
private String kind = "ServiceAccount";
private String name;
private String namespace;
// Getters and setters
public String getKind() { return kind; }
public void setKind(String kind) { this.kind = kind; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getNamespace() { return namespace; }
public void setNamespace(String namespace) { this.namespace = namespace; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Source {
private String kind = "ServiceAccount";
private String name;
private String namespace;
// Getters and setters
public String getKind() { return kind; }
public void setKind(String kind) { this.kind = kind; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getNamespace() { return namespace; }
public void setNamespace(String namespace) { this.namespace = namespace; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Rule {
private String kind;
private String name;
// Getters and setters
public String getKind() { return kind; }
public void setKind(String kind) { this.kind = kind; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
}
// TrafficSpec.java
package com.company.osm.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TrafficSpec {
@JsonProperty("apiVersion")
private String apiVersion = "specs.smi-spec.io/v1alpha4";
@JsonProperty("kind")
private String kind = "HTTPRouteGroup";
@JsonProperty("metadata")
private MeshConfig.Metadata metadata;
@JsonProperty("spec")
private HttpRouteGroupSpec spec;
// Getters and setters
public String getApiVersion() { return apiVersion; }
public void setApiVersion(String apiVersion) { this.apiVersion = apiVersion; }
public String getKind() { return kind; }
public void setKind(String kind) { this.kind = kind; }
public MeshConfig.Metadata getMetadata() { return metadata; }
public void setMetadata(MeshConfig.Metadata metadata) { this.metadata = metadata; }
public HttpRouteGroupSpec getSpec() { return spec; }
public void setSpec(HttpRouteGroupSpec spec) { this.spec = spec; }
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class HttpRouteGroupSpec {
private List<HttpMatch> matches;
// Getters and setters
public List<HttpMatch> getMatches() { return matches; }
public void setMatches(List<HttpMatch> matches) { this.matches = matches; }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class HttpMatch {
private String name;
private List<String> methods;
private List<String> pathRegex;
private List<String> headers;
// Getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public List<String> getMethods() { return methods; }
public void setMethods(List<String> methods) { this.methods = methods; }
public List<String> getPathRegex() { return pathRegex; }
public void setPathRegex(List<String> pathRegex) { this.pathRegex = pathRegex; }
public List<String> getHeaders() { return headers; }
public void setHeaders(List<String> headers) { this.headers = headers; }
}
}
OSM Service Implementation
1. OSM Management Service
```java
// OsmManagementService.java
package com.company.osm.service;
import com.company.osm.config.OsmConfig;
import com.company.osm.model.*;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.apis.CustomObjectsApi;
import io.kubernetes.client.openapi.models.V1ObjectMeta;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class OsmManagementService {
private static final Logger log = LoggerFactory.getLogger(OsmManagementService.class);
private final OsmConfig osmConfig;
private final CustomObjectsApi customObjectsApi;
public OsmManagementService(OsmConfig osmConfig, ApiClient apiClient) {
this.osmConfig = osmConfig;
this.customObjectsApi = new CustomObjectsApi(apiClient);
}
/**
* Create or update MeshConfig
*/
public boolean createOrUpdateMeshConfig(MeshConfig meshConfig) {
try {
String namespace = osmConfig.getNamespace();
String name = meshConfig.getMetadata().getName();
// Check if MeshConfig exists
Object existing = customObjectsApi.getNamespacedCustomObject(
"config.openservicemesh.io",
"v1alpha1",
namespace,
"meshconfigs",
name
);
if (existing != null) {
// Update existing MeshConfig
customObjectsApi.replaceNamespacedCustomObject(
"config.openservicemesh.io",
"v1alpha1",
namespace,
"meshconfigs",
name,
meshConfig
);
log.info("Updated MeshConfig: {}", name);
} else {
// Create new MeshConfig
customObjectsApi.createNamespacedCustomObject(
"config.openservicemesh.io",
"v1alpha1",
namespace,
"meshconfigs",
meshConfig,
null, null, null
);
log.info("Created MeshConfig: {}", name);
}
return true;
} catch (ApiException e) {
log.error("Failed to create/update MeshConfig", e);
return false;
}
}
/**
* Create TrafficTarget for service-to-service communication
*/
public boolean createTrafficTarget(TrafficTarget trafficTarget) {
try {
customObjectsApi.createNamespacedCustomObject(
"access.smi-spec.io",
"v1alpha3",
trafficTarget.getMetadata().getNamespace(),
"traffictargets",
trafficTarget,
null, null, null
);
log.info("Created TrafficTarget: {}", trafficTarget.getMetadata().getName());
return true;
} catch (ApiException e) {
log.error("Failed to create TrafficTarget", e);
return false;
}
}
/**
* Create HTTPRouteGroup for traffic specification
*/
public boolean createHttpRouteGroup(TrafficSpec trafficSpec) {
try {
customObjectsApi.createNamespacedCustomObject(
"specs.smi-spec.io",
"v1alpha4",
trafficSpec.getMetadata().getNamespace(),
"httproutegroups",
trafficSpec,
null, null, null
);
log.info("Created HTTPRouteGroup: {}", trafficSpec.getMetadata().getName());
return true;
} catch (ApiException e) {
log.error("Failed to create HTTPRouteGroup", e);
return false;
}
}
/**
* Get all TrafficTargets in namespace
*/
public List<TrafficTarget> getTrafficTargets(String namespace) {
try {
Object response = customObjectsApi.listNamespacedCustomObject(
"access.smi-spec.io",
"v1alpha3",
namespace,
"traffictargets",
null, null, null, null, null, null, null, null
);
// Parse response and convert to TrafficTarget objects
// This is a simplified implementation
return Collections.emptyList();
} catch (ApiException e) {
log.error("Failed to get TrafficTargets in namespace: {}", namespace, e);
return Collections.emptyList();
}
}
/**
* Delete TrafficTarget
*/
public boolean deleteTrafficTarget(String name, String namespace) {
try {
customObjectsApi.deleteNamespacedCustomObject(
"access.smi-spec.io",
"v1alpha3",
namespace,
"traffictargets",
name,
null, null, null, null, null, null
);
log.info("Deleted TrafficTarget: {}", name);
return true;
} catch (ApiException e) {
log.error("Failed to delete TrafficTarget: {}", name, e);
return false;
}
}
/**
* Enable mutual TLS for a namespace
*/
public boolean enableMutualTLS(String namespace) {
try {
// This would involve creating or updating MeshConfig
// and potentially other resources
MeshConfig meshConfig = createDefaultMeshConfig();
meshConfig.getSpec().getCertificate().setServiceCertValidityDuration("24h");
return createOrUpdateMeshConfig(meshConfig);
} catch (Exception e) {
log.error("Failed to enable mutual TLS for namespace: {}", namespace, e);
return false;
}
}
/**
* Configure traffic splitting between services
*/
public boolean configureTrafficSplit(String name, String namespace,
Map<String, Integer> backendWeights) {
try {
// Create TrafficSplit resource
Map<String, Object> trafficSplit = createTrafficSplitResource(name, namespace, backendWeights);
customObjectsApi.createNamespacedCustomObject(
"split.smi-spec.io",
"v1alpha4",
namespace,
"trafficsplits",
trafficSplit,
null, null, null
);
log.info("Created TrafficSplit: {} with weights: {}", name, backendWeights);
return true;
} catch (ApiException e) {
log.error("Failed to create TrafficSplit: {}", name, e);
return false;
}
}
private MeshConfig createDefaultMeshConfig() {
MeshConfig meshConfig = new MeshConfig();
MeshConfig.Metadata metadata = new MeshConfig.Metadata();
metadata.setName("osm-mesh-config");
metadata.setNamespace(osmConfig.getNamespace());
meshConfig.setMetadata(metadata);
MeshConfig.Spec spec = new MeshConfig.Spec();
// Configure traffic
MeshConfig.Traffic traffic = new MeshConfig.Traffic();
traffic.setEnableEgress(osmConfig.getTraffic().isEnableEgress());
traffic.setEnablePermissiveTrafficPolicy(osmConfig.getTraffic().isEnablePermissiveTrafficPolicy());
traffic.setTrafficInterceptionMode(osmConfig.getTraffic().getTrafficInterceptionMode());
spec.setTraffic(traffic);
//
Pyroscope Profiling in Java
Explains how to use Pyroscope for continuous profiling in Java applications, helping developers analyze CPU and memory usage patterns to improve performance and identify bottlenecks.
https://macronepal.com/blog/pyroscope-profiling-in-java/
OpenTelemetry Metrics in Java: Comprehensive Guide
Provides a complete guide to collecting and exporting metrics in Java using OpenTelemetry, including counters, histograms, gauges, and integration with monitoring tools. (MACRO NEPAL)
https://macronepal.com/blog/opentelemetry-metrics-in-java-comprehensive-guide/
OTLP Exporter in Java: Complete Guide for OpenTelemetry
Explains how to configure OTLP exporters in Java to send telemetry data such as traces, metrics, and logs to monitoring systems using HTTP or gRPC protocols. (MACRO NEPAL)
https://macronepal.com/blog/otlp-exporter-in-java-complete-guide-for-opentelemetry/
Thanos Integration in Java: Global View of Metrics
Explains how to integrate Thanos with Java monitoring systems to create a scalable global metrics view across multiple Prometheus instances.
https://macronepal.com/blog/thanos-integration-in-java-global-view-of-metrics
Time Series with InfluxDB in Java: Complete Guide (Version 2)
Explains how to manage time-series data using InfluxDB in Java applications, including storing, querying, and analyzing metrics data.
https://macronepal.com/blog/time-series-with-influxdb-in-java-complete-guide-2
Time Series with InfluxDB in Java: Complete Guide
Provides an overview of integrating InfluxDB with Java for time-series data handling, including monitoring applications and managing performance metrics.
https://macronepal.com/blog/time-series-with-influxdb-in-java-complete-guide
Implementing Prometheus Remote Write in Java (Version 2)
Explains how to configure Java applications to send metrics data to Prometheus-compatible systems using the remote write feature for scalable monitoring.
https://macronepal.com/blog/implementing-prometheus-remote-write-in-java-a-complete-guide-2
Implementing Prometheus Remote Write in Java: Complete Guide
Provides instructions for sending metrics from Java services to Prometheus servers, enabling centralized monitoring and real-time analytics.
https://macronepal.com/blog/implementing-prometheus-remote-write-in-java-a-complete-guide
Building a TileServer GL in Java: Vector and Raster Tile Server
Explains how to build a TileServer GL in Java for serving vector and raster map tiles, useful for geographic visualization and mapping applications.
https://macronepal.com/blog/building-a-tileserver-gl-in-java-vector-and-raster-tile-server
Indoor Mapping in Java
Explains how to create indoor mapping systems in Java, including navigation inside buildings, spatial data handling, and visualization techniques.