网站建设项目验收报告,合肥婚恋网站建设,36氪是wordpress开发的吗,广州关于进一步优化本文使用K8s当做服务注册与发现、配置管理#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.…本文使用K8s当做服务注册与发现、配置管理使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.14/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIdservice-provider/artifactIdversion0.0.1-SNAPSHOT/versionnameservice-provider/namedescriptionservice-provider/descriptionpropertiesjava.version11/java.version!-- os.detected.classifierosx-aarch_64/os.detected.classifier--os.detected.classifierosx-x86_64/os.detected.classifier/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdtypepom/typescopeimport/scopeversion2.5.14/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2020.0.6/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-kubernetes-dependencies/artifactIdversion1.1.10.RELEASE/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-kubernetes-client-all/artifactId/dependency!-- gRpc --dependencygroupIdnet.devh/groupIdartifactIdgrpc-spring-boot-starter/artifactIdversion2.13.1.RELEASE/version/dependencydependencygroupIdio.grpc/groupIdartifactIdgrpc-protobuf/artifactIdversion1.52.1/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optionalversion1.18.24/version/dependency/dependenciesbuildextensionsextensiongroupIdkr.motd.maven/groupIdartifactIdos-maven-plugin/artifactIdversion1.7.1/version/extension/extensionspluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationclassifierexec/classifier/configuration/pluginplugingroupIdorg.xolstice.maven.plugins/groupIdartifactIdprotobuf-maven-plugin/artifactIdversion0.6.1/versionconfigurationprotocArtifactcom.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}/protocArtifactpluginIdgrpc-java/pluginIdpluginArtifactio.grpc:protoc-gen-grpc-java:1.52.1:exe:${os.detected.classifier}/pluginArtifact/configurationexecutionsexecutiongoalsgoalcompile/goalgoalcompile-custom/goal/goals/execution/executions/plugin/plugins/build/project
配置文件 application.ymlgrpc:server:port: 9090
server:port: 30000
spring:application:name: service-providercloud:kubernetes:reload:enabled: truemode: pollingperiod: 5000logging:level:org.springframework.cloud.loadbalancer: debug主类 ServiceProviderApplicationpackage com.example.service.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
EnableDiscoveryClient
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}
}在 src/main/proto文件夹下新增PB文件 HelloFacade.protosyntax proto3;option java_multiple_files true;
option java_package com.example.service.provider.api;
option java_outer_classname HelloServiceProto;service HelloService {rpc SayHello (SayHelloRequest) returns (SayHelloResponse) {}
}message SayHelloRequest {string name 1;
}message SayHelloResponse {int32 code 1;string message 2;bool success 3;SayHelloData data 4;
}message SayHelloData {string name 1;string content 2;
}接口实现类package com.example.service.provider.facade;import com.example.service.provider.api.HelloServiceGrpc;
import com.example.service.provider.api.SayHelloData;
import com.example.service.provider.api.SayHelloRequest;
import com.example.service.provider.api.SayHelloResponse;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.server.service.GrpcService;Slf4j
GrpcService
public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase {Overridepublic void sayHello(SayHelloRequest request, io.grpc.stub.StreamObserverSayHelloResponse responseObserver) {log.info(接收consumer的say hello grpc 请求);SayHelloData helloData SayHelloData.newBuilder().setName(maple).setContent(say hello).build();SayHelloResponse.Builder builder SayHelloResponse.newBuilder().setCode(0).setMessage(success).setSuccess(true).setData(helloData);responseObserver.onNext(builder.build());responseObserver.onCompleted();}
}
DockerfileFROM openjdk:11-jdk-slim
ENV jarNameservice-provider.jar
ADD service-provider-0.0.1-SNAPSHOT-exec.jar $jarName
ENTRYPOINT java -Duser.timezoneGMT8 -jar $jarNameK8s声明yaml文件 service-provider-deploy.yamlapiVersion: v1
kind: Namespace
metadata:name: service-k8s-demolabels:name: service-k8s-demo---apiVersion: v1
kind: ServiceAccount
metadata:name: service-k8s-demonamespace: service-k8s-demo---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: service-k8s-demoname: service-k8s-demo
rules:- apiGroups:- resources:- services- configmaps- endpoints- nodes- pods- secrets- namespacesverbs:- get- list- watch---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: service-k8s-demonamespace: service-k8s-demo
subjects:
- kind: ServiceAccountname: service-k8s-demonamespace: service-k8s-demo
roleRef:kind: ClusterRolename: service-k8s-demoapiGroup: rbac.authorization.k8s.io---apiVersion: apps/v1
kind: Deployment
metadata:name: service-providernamespace: service-k8s-demolabels:app: service-provider
spec:replicas: 3template:metadata:name: service-providerlabels:app: service-providerspec:containers:- name: service-providerimage: service-provider:1.0ports:- name: httpprotocol: TCPcontainerPort: 30000- name: grpcprotocol: TCPcontainerPort: 9090imagePullPolicy: IfNotPresentserviceAccountName: service-k8s-demorestartPolicy: Alwaysselector:matchLabels:app: service-provider---apiVersion: v1
kind: Service
metadata:name: service-providernamespace: service-k8s-demo
spec:selector:app: service-providerports:- port: 80targetPort: 30000name: http- port: 9090targetPort: 9090name: grpcclusterIP: None
本地启动测试三、准备service-consumerpom?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.14/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIdservice-consumer/artifactIdversion0.0.1-SNAPSHOT/versionnameservice-consumer/namedescriptionservice-consumer/descriptionpropertiesjava.version11/java.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdtypepom/typescopeimport/scopeversion2.5.14/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2020.0.6/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-kubernetes-dependencies/artifactIdversion1.1.10.RELEASE/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdcom.example/groupIdartifactIdservice-provider/artifactIdversion0.0.1-SNAPSHOT/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-kubernetes-client-all/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optionalversion1.18.24/version/dependency!-- gRpc --dependencygroupIdnet.devh/groupIdartifactIdgrpc-spring-boot-starter/artifactIdversion2.13.1.RELEASE/version/dependencydependencygroupIdio.grpc/groupIdartifactIdgrpc-protobuf/artifactIdversion1.52.1/version/dependency/dependenciesbuildextensionsextensiongroupIdkr.motd.maven/groupIdartifactIdos-maven-plugin/artifactIdversion1.7.1/version/extension/extensionspluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationclassifierexec/classifier/configuration/pluginplugingroupIdorg.xolstice.maven.plugins/groupIdartifactIdprotobuf-maven-plugin/artifactIdversion0.6.1/versionconfigurationprotocArtifactcom.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}/protocArtifactpluginIdgrpc-java/pluginIdpluginArtifactio.grpc:protoc-gen-grpc-java:1.52.1:exe:${os.detected.classifier}/pluginArtifact/configurationexecutionsexecutiongoalsgoalcompile/goalgoalcompile-custom/goal/goals/execution/executions/plugin/plugins/build
/project
配置文件 application.ymlgrpc:server:port: 9091client:service-provider:negotiation-type: plaintextenable-keep-alive: truekeep-alive-without-calls: trueaddress: static://service-provider:9090server:port: 30001
spring:application:name: service-consumercloud:kubernetes:reload:enabled: truemode: pollingperiod: 5000logging:level:org.springframework.cloud.loadbalancer: debug
主类 ServiceConsumerApplicationpackage com.example.service.consumer;import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;Slf4j
RestController
EnableDiscoveryClient
SpringBootApplication
RequiredArgsConstructor
public class ServiceConsumerApplication {private final DiscoveryClient discoveryClient;private final ProviderServiceGrpcClient providerServiceGrpcClient;public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}GetMapping(/grpc/hello)public String sayHello() {log.info(消费服务:service-consumer grpc 调用 service-provider);return providerServiceGrpcClient.sayHello();}GetMapping(/consumers/services)public ListString findServices() {log.info(当前注册中心下所有服务);ListString services discoveryClient.getServices();services.stream().map(discoveryClient::getInstances).forEach(v -v.forEach(s - System.out.printf(%s:%s uri:%s%n, s.getHost(), s.getPort(), s.getUri())));return services;}
}gRpc调用Provider ProviderServiceGrpcClientpackage com.example.service.consumer;import com.example.service.provider.api.HelloServiceGrpc;
import com.example.service.provider.api.SayHelloRequest;
import com.example.service.provider.api.SayHelloResponse;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service;Service
public class ProviderServiceGrpcClient {GrpcClient(service-provider)private HelloServiceGrpc.HelloServiceBlockingStub helloServiceBlockingStub;public String sayHello() {SayHelloRequest request SayHelloRequest.newBuilder().setName(maple123).build();SayHelloResponse sayHelloResponse helloServiceBlockingStub.sayHello(request);return sayHelloResponse.toString();}
}
DockerfileFROM openjdk:11-jdk-slim
ENV jarNameservice-consumer.jar
ADD service-consumer-0.0.1-SNAPSHOT-exec.jar $jarName
ENTRYPOINT java -Duser.timezoneGMT8 -jar $jarNameK8s声明yaml文件 service-consumer-deploy.yamlapiVersion: v1
kind: Namespace
metadata:name: service-k8s-demolabels:name: service-k8s-demo---apiVersion: v1
kind: ServiceAccount
metadata:name: service-k8s-demonamespace: service-k8s-demo---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: service-k8s-demoname: service-k8s-demo
rules:- apiGroups:- resources:- services- configmaps- endpoints- nodes- pods- secrets- namespacesverbs:- get- list- watch---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: service-k8s-demonamespace: service-k8s-demo
subjects:- kind: ServiceAccountname: service-k8s-demonamespace: service-k8s-demo
roleRef:kind: ClusterRolename: service-k8s-demoapiGroup: rbac.authorization.k8s.io---apiVersion: apps/v1
kind: Deployment
metadata:name: service-consumernamespace: service-k8s-demolabels:app: service-consumer
spec:replicas: 1template:metadata:name: service-consumerlabels:app: service-consumerspec:containers:- name: service-consumerimage: service-consumer:1.0ports:- name: httpprotocol: TCPcontainerPort: 30001- name: grpcprotocol: TCPcontainerPort: 9091imagePullPolicy: IfNotPresentserviceAccountName: service-k8s-demorestartPolicy: Alwaysselector:matchLabels:app: service-consumer---apiVersion: v1
kind: Service
metadata:name: service-consumernamespace: service-k8s-demo
spec:selector:app: service-consumerports:- port: 80targetPort: 30001name: http- port: 9091targetPort: 9091name: grpctype: NodePort本地启动测试四、打镜像docker build -t service-provider:1.0 .
docker build -t service-consumer:1.0 .五、执行K8s yaml文件 创建命名空间、账号、角色、部署应用、暴露端口等kubetl apply -f service-provider-deploy.yaml
kubetl apply -f service-consumer-deploy.yaml六、查看与测试gRpc正常访问但是发现一个问题下面的图片上面三个是Provider发现负载均衡失效了请求全都打在了一个Provider里搜了下发现和 gRpc基于HTTP2.0 多路复用 有关之后再处理吧。