Merge remote-tracking branch 'origin/main'
diff --git a/helloworld/README.md b/helloworld/README.md
index a33991f..7c7c176 100644
--- a/helloworld/README.md
+++ b/helloworld/README.md
@@ -11,7 +11,7 @@
 ## How to run
 
 ### Prerequisites
-1. Install `protoc [version3][]
+1. Install `protoc` [version3][]
    Please refer to [Protocol Buffer Compiler Installation][].
 
 2. Install `protoc-gen-go` and `protoc-gen-triple`
diff --git a/java_interop/non-protobuf-dubbo/README.md b/java_interop/non-protobuf-dubbo/README.md
index a78d28a..78b078e 100644
--- a/java_interop/non-protobuf-dubbo/README.md
+++ b/java_interop/non-protobuf-dubbo/README.md
@@ -1,3 +1,31 @@
 # Dubbo java and go interoperability, dubbo protocol
 
-Please refer to [Multiple Protocols](https://github.com/apache/dubbo-go-samples/tree/main/rpc/multi-protocols) for how to write non-protobuf style protocol.
\ No newline at end of file
+Please refer to [Multiple Protocols](https://github.com/apache/dubbo-go-samples/tree/main/rpc/multi-protocols) for how to write non-protobuf style protocol.
+
+# Run
+
+## Java
+
+client
+```bash
+# in directory java-client
+mvn -e clean compile exec:java -Dexec.mainClass="org.apache.dubbo.hessian2.client.Application"
+```
+
+server
+```bash
+# in directory java-server
+mvn -e clean compile exec:java -Dexec.mainClass="org.apache.dubbo.hessian2.provider.Application"
+```
+
+## go
+
+client
+```bash
+go run go-client/client.go
+```
+
+server
+```bash
+go run go-server/server.go
+```
diff --git a/java_interop/non-protobuf-dubbo/go-client/client.go b/java_interop/non-protobuf-dubbo/go-client/client.go
new file mode 100644
index 0000000..f279441
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/go-client/client.go
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	"context"
+	"fmt"
+)
+
+import (
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
+
+	"dubbo.apache.org/dubbo-go/v3"
+	"dubbo.apache.org/dubbo-go/v3/client"
+	"dubbo.apache.org/dubbo-go/v3/common/constant"
+)
+
+import (
+	greet_gen "github.com/apache/dubbo-go-samples/java_interop/non-protobuf-dubbo/proto"
+)
+
+func main() {
+	ctx := context.Background()
+
+	ins, err := dubbo.NewInstance(
+		dubbo.WithName("dubbo_rpc_hessian2_client"),
+	)
+	if err != nil {
+		panic(err)
+	}
+
+	cli, err := ins.NewClient(
+		client.WithClientURL("127.0.0.1:50052"),
+		client.WithClientProtocolDubbo(),
+		client.WithClientSerialization(constant.Hessian2Serialization),
+	)
+	if err != nil {
+		panic(err)
+	}
+
+	svc, err := greet_gen.NewGreetingsService(cli)
+	if err != nil {
+		panic(err)
+	}
+
+	resp, err := svc.Greet(ctx, &greet_gen.GreetRequest{
+		Name: "dubbo-go",
+	})
+
+	if err != nil {
+		panic(err)
+	}
+	fmt.Println(resp.Greeting)
+}
diff --git a/java_interop/non-protobuf-dubbo/go-server/server.go b/java_interop/non-protobuf-dubbo/go-server/server.go
new file mode 100644
index 0000000..8c514a2
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/go-server/server.go
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	"context"
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
+	"dubbo.apache.org/dubbo-go/v3/protocol"
+	"dubbo.apache.org/dubbo-go/v3/server"
+	"fmt"
+	greet "github.com/apache/dubbo-go-samples/java_interop/non-protobuf-dubbo/proto"
+	"github.com/dubbogo/gost/log/logger"
+)
+
+type GreetDubboServer struct {
+}
+
+func (srv *GreetDubboServer) Greet(ctx context.Context, req *greet.GreetRequest) (*greet.GreetResponse, error) {
+	resp := &greet.GreetResponse{Greeting: fmt.Sprintf("Hi! The name of the request is:	 %s", req.Name)}
+	return resp, nil
+}
+
+func main() {
+	srv, err := server.NewServer(
+		server.WithServerProtocol(
+			protocol.WithPort(50052),
+			protocol.WithDubbo(),
+		),
+	)
+
+	if err != nil {
+		panic(err)
+	}
+
+	if err := greet.RegisterGreetingsServiceHandler(srv, &GreetDubboServer{}); err != nil {
+		panic(err)
+	}
+
+	if err := srv.Serve(); err != nil {
+		logger.Error(err)
+	}
+}
diff --git a/java_interop/non-protobuf-dubbo/java-client/README.md b/java_interop/non-protobuf-dubbo/java-client/README.md
new file mode 100644
index 0000000..a18d076
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/README.md
@@ -0,0 +1 @@
+mvn -e clean compile exec:java -Dexec.mainClass="org.apache.dubbo.hessian2.client.Application"
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/java-client/pom.xml b/java_interop/non-protobuf-dubbo/java-client/pom.xml
new file mode 100644
index 0000000..4c0daca
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>31</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.apache.dubbo</groupId>
+    <version>1.0-SNAPSHOT</version>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-samples-api</artifactId>
+    <name>java-client</name>
+    <description>Java Client</description>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <dubbo.version>3.3.0-beta.3</dubbo.version>
+        <log4j2.version>2.20.0</log4j2.version>
+        <junit5.version>5.9.2</junit5.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+
+        <!-- SLF4J API -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.30</version>
+        </dependency>
+        <!-- Log4j2 to SLF4J Bridge -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+        <!-- Log4j2 Core -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+        <!-- Log4j2 API -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>${junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <version>${junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <compilerArg>-proc:none</compilerArg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetRequest.java b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetRequest.java
new file mode 100644
index 0000000..14c452c
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetRequest.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.hessian2.api;
+
+public class GreetRequest implements java.io.Serializable {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}
diff --git a/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetResponse.java b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetResponse.java
new file mode 100644
index 0000000..e396766
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetResponse.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.hessian2.api;
+
+public class GreetResponse implements java.io.Serializable {
+	private String greeting;
+
+	public String getGreeting() {
+		return greeting;
+	}
+
+	public void setGreeting(String greeting) {
+		this.greeting = greeting;
+	}
+}
diff --git a/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetingsService.java b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetingsService.java
new file mode 100644
index 0000000..48eaf33
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/api/GreetingsService.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.hessian2.api;
+
+public interface GreetingsService {
+    GreetResponse greet(GreetRequest req);
+}
diff --git a/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/client/Application.java b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/client/Application.java
new file mode 100644
index 0000000..4cb99c4
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/src/main/java/org/apache/dubbo/hessian2/client/Application.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.hessian2.client;
+
+import java.io.IOException;
+
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.bootstrap.builders.ReferenceBuilder;
+import org.apache.dubbo.hessian2.api.GreetRequest;
+import org.apache.dubbo.hessian2.api.GreetingsService;
+
+public class Application {
+    public static void main(String[] args) throws IOException {
+        ReferenceConfig<GreetingsService> reference =
+                ReferenceBuilder.<GreetingsService>newBuilder()
+                .interfaceClass(GreetingsService.class)
+                .url("dubbo://localhost:50052")
+                .build();
+        DubboBootstrap.getInstance().reference(reference).start();
+        GreetingsService service = reference.get();
+
+        GreetRequest request = new GreetRequest();
+        request.setName("dubbo-java");
+        String message = service.greet(request).getGreeting();
+
+        System.out.println("Receive result ======> " + message);
+        System.in.read();
+        System.exit(0);
+    }
+
+}
diff --git a/java_interop/non-protobuf-dubbo/java-client/src/main/resources/log4j2.xml b/java_interop/non-protobuf-dubbo/java-client/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..69e1321
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-client/src/main/resources/log4j2.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/java_interop/non-protobuf-dubbo/java-server/README.md b/java_interop/non-protobuf-dubbo/java-server/README.md
new file mode 100644
index 0000000..a39b590
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/README.md
@@ -0,0 +1 @@
+mvn -e clean compile exec:java -Dexec.mainClass="org.apache.dubbo.hessian2.provider.Application"
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/java-server/pom.xml b/java_interop/non-protobuf-dubbo/java-server/pom.xml
new file mode 100644
index 0000000..03068e4
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>31</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.apache.dubbo</groupId>
+    <version>1.0-SNAPSHOT</version>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jave-server</artifactId>
+    <name>Java Server</name>
+    <description>Java Server</description>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <dubbo.version>3.3.0-beta.3</dubbo.version>
+        <log4j2.version>2.20.0</log4j2.version>
+        <junit5.version>5.9.2</junit5.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+
+        <!-- SLF4J API -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.30</version>
+        </dependency>
+        <!-- Log4j2 to SLF4J Bridge -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+        <!-- Log4j2 Core -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+        <!-- Log4j2 API -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <version>${log4j2.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>${junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <version>${junit5.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <compilerArg>-proc:none</compilerArg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetRequest.java b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetRequest.java
new file mode 100644
index 0000000..14c452c
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetRequest.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.hessian2.api;
+
+public class GreetRequest implements java.io.Serializable {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}
diff --git a/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetResponse.java b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetResponse.java
new file mode 100644
index 0000000..e396766
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetResponse.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.hessian2.api;
+
+public class GreetResponse implements java.io.Serializable {
+	private String greeting;
+
+	public String getGreeting() {
+		return greeting;
+	}
+
+	public void setGreeting(String greeting) {
+		this.greeting = greeting;
+	}
+}
diff --git a/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetingsService.java b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetingsService.java
new file mode 100644
index 0000000..48eaf33
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/api/GreetingsService.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.hessian2.api;
+
+public interface GreetingsService {
+    GreetResponse greet(GreetRequest req);
+}
diff --git a/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/provider/Application.java b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/provider/Application.java
new file mode 100644
index 0000000..9172e23
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/provider/Application.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.hessian2.provider;
+
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.bootstrap.builders.ApplicationBuilder;
+import org.apache.dubbo.config.bootstrap.builders.ProtocolBuilder;
+import org.apache.dubbo.config.bootstrap.builders.ServiceBuilder;
+import org.apache.dubbo.hessian2.api.GreetingsService;
+
+public class Application {
+    public static void main(String[] args) {
+        DubboBootstrap.getInstance()
+                .application(ApplicationBuilder.newBuilder().name("non-protobuf-dubbo").logger("slf4j").build())
+                .protocol(ProtocolBuilder.newBuilder().name("dubbo").port(50052).build())
+                .service(ServiceBuilder.newBuilder().interfaceClass(GreetingsService.class).ref(new GreetingsServiceImpl()).build())
+                .start()
+                .await();
+    }
+}
diff --git a/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/provider/GreetingsServiceImpl.java b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/provider/GreetingsServiceImpl.java
new file mode 100644
index 0000000..253be95
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/src/main/java/org/apache/dubbo/hessian2/provider/GreetingsServiceImpl.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.hessian2.provider;
+
+import org.apache.dubbo.hessian2.api.GreetRequest;
+import org.apache.dubbo.hessian2.api.GreetResponse;
+import org.apache.dubbo.hessian2.api.GreetingsService;
+
+public class GreetingsServiceImpl implements GreetingsService {
+    @Override
+    public GreetResponse greet(GreetRequest req) {
+        GreetResponse response = new GreetResponse();
+        response.setGreeting("hi, " + req.getName());
+        return response;
+    }
+}
diff --git a/java_interop/non-protobuf-dubbo/java-server/src/main/resources/log4j2.xml b/java_interop/non-protobuf-dubbo/java-server/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..69e1321
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/java-server/src/main/resources/log4j2.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/java_interop/non-protobuf-dubbo/proto/build.sh b/java_interop/non-protobuf-dubbo/proto/build.sh
new file mode 100755
index 0000000..e84c04b
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/build.sh
@@ -0,0 +1,4 @@
+protoc -I ./ \
+  --go-hessian2_out=./ --go-hessian2_opt=paths=source_relative \
+  --go-dubbo_out=./  --go-dubbo_opt=paths=source_relative \
+  ./greet.proto
diff --git a/java_interop/non-protobuf-dubbo/proto/greet.dubbo.go b/java_interop/non-protobuf-dubbo/proto/greet.dubbo.go
new file mode 100644
index 0000000..5ce2612
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/greet.dubbo.go
@@ -0,0 +1,110 @@
+// Code generated by protoc-gen-go-dubbo. DO NOT EDIT.
+
+// Source: greet.proto
+// Package: org_apache_dubbo_hessian2_api
+
+package greet
+
+import (
+	"context"
+
+	"dubbo.apache.org/dubbo-go/v3"
+	"dubbo.apache.org/dubbo-go/v3/client"
+	"dubbo.apache.org/dubbo-go/v3/common"
+	"dubbo.apache.org/dubbo-go/v3/common/constant"
+	"dubbo.apache.org/dubbo-go/v3/server"
+)
+
+const (
+	// GreetingsServiceName is the fully-qualified name of the GreetingsService service.
+	GreetingsServiceName = "org.apache.dubbo.hessian2.api.GreetingsService"
+
+	// These constants are the fully-qualified names of the RPCs defined in this package. They're
+	// exposed at runtime as procedure and as the final two segments of the HTTP route.
+	//
+	// Note that these are different from the fully-qualified method names used by
+	// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
+	// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
+	// period.
+	// GreetingsServiceGreetProcedure is the fully-qualified name of the GreetingsService's Greet RPC.'
+	GreetingsServiceGreetProcedure = "/org.apache.dubbo.hessian2.api.GreetingsService/greet"
+)
+
+var (
+	_ GreetingsService = (*GreetingsServiceImpl)(nil)
+)
+
+type GreetingsService interface {
+	Greet(ctx context.Context, req *GreetRequest, opts ...client.CallOption) (*GreetResponse, error)
+}
+
+// NewGreetingsService constructs a client for the org.apache.dubbo.hessian2.api.GreetingsService service
+func NewGreetingsService(cli *client.Client, opts ...client.ReferenceOption) (GreetingsService, error) {
+	conn, err := cli.DialWithInfo("org.apache.dubbo.hessian2.api.GreetingsService", &GreetingsService_ClientInfo, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return &GreetingsServiceImpl{
+		conn: conn,
+	}, nil
+}
+
+func SetConsumerService(srv common.RPCService) {
+	dubbo.SetConsumerServiceWithInfo(srv, &GreetingsService_ClientInfo)
+}
+
+// GreetingsServiceImpl implements GreetingsService
+type GreetingsServiceImpl struct {
+	conn *client.Connection
+}
+
+func (c *GreetingsServiceImpl) Greet(ctx context.Context, req *GreetRequest, opts ...client.CallOption) (*GreetResponse, error) {
+	resp := new(GreetResponse)
+	if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "greet", opts...); err != nil {
+		return nil, err
+	}
+	return resp, nil
+}
+
+var GreetingsService_ClientInfo = client.ClientInfo{
+	InterfaceName: "org.apache.dubbo.hessian2.api.GreetingsService",
+	MethodNames: []string{
+		"greet",
+	},
+	ConnectionInjectFunc: func(dubboCliRaw interface{}, conn *client.Connection) {
+		dubboCli := dubboCliRaw.(*GreetingsServiceImpl)
+		dubboCli.conn = conn
+	},
+}
+
+// GreetingsServiceHandler is an implementation of the org.apache.dubbo.hessian2.api.GreetingsService service.
+type GreetingsServiceHandler interface {
+	Greet(ctx context.Context, req *GreetRequest) (*GreetResponse, error)
+}
+
+func RegisterGreetingsServiceHandler(srv *server.Server, hdlr GreetingsServiceHandler, opts ...server.ServiceOption) error {
+	return srv.Register(hdlr, &GreetingsService_ServiceInfo, opts...)
+}
+
+func SetProviderService(srv common.RPCService) {
+	dubbo.SetProviderServiceWithInfo(srv, &GreetingsService_ServiceInfo)
+}
+
+var GreetingsService_ServiceInfo = server.ServiceInfo{
+	InterfaceName: "org.apache.dubbo.hessian2.api.GreetingsService",
+	ServiceType:   (*GreetingsServiceHandler)(nil),
+	Methods: []server.MethodInfo{
+		{
+			Name: "greet",
+			Type: constant.CallUnary,
+			ReqInitFunc: func() interface{} {
+				return new(GreetResponse)
+			},
+			MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+				req := args[0].(*GreetRequest)
+				res, err := handler.(GreetingsServiceHandler).Greet(ctx, req)
+				return res, err
+			},
+		},
+	},
+}
diff --git a/java_interop/non-protobuf-dubbo/proto/greet.hessian2.go b/java_interop/non-protobuf-dubbo/proto/greet.hessian2.go
new file mode 100644
index 0000000..0fca509
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/greet.hessian2.go
@@ -0,0 +1,63 @@
+// Code generated by protoc-gen-go-dubbo. DO NOT EDIT.
+
+// Source: greet.proto
+// Package: org_apache_dubbo_hessian2_api
+
+package greet
+
+import (
+	dubbo_go_hessian2 "github.com/apache/dubbo-go-hessian2"
+)
+
+type GreetRequest struct {
+	Name string
+}
+
+func (x *GreetRequest) JavaClassName() string {
+	return "org.apache.dubbo.hessian2.api.GreetRequest"
+}
+
+func (x *GreetRequest) String() string {
+	e := dubbo_go_hessian2.NewEncoder()
+	err := e.Encode(x)
+	if err != nil {
+		return ""
+	}
+	return string(e.Buffer())
+}
+
+func (x *GreetRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+type GreetResponse struct {
+	Greeting string
+}
+
+func (x *GreetResponse) JavaClassName() string {
+	return "org.apache.dubbo.hessian2.api.GreetResponse"
+}
+
+func (x *GreetResponse) String() string {
+	e := dubbo_go_hessian2.NewEncoder()
+	err := e.Encode(x)
+	if err != nil {
+		return ""
+	}
+	return string(e.Buffer())
+}
+
+func (x *GreetResponse) GetGreeting() string {
+	if x != nil {
+		return x.Greeting
+	}
+	return ""
+}
+
+func init() {
+	dubbo_go_hessian2.RegisterPOJO(new(GreetRequest))
+	dubbo_go_hessian2.RegisterPOJO(new(GreetResponse))
+}
diff --git a/java_interop/non-protobuf-dubbo/proto/greet.proto b/java_interop/non-protobuf-dubbo/proto/greet.proto
new file mode 100644
index 0000000..c87ee25
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/greet.proto
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package org.apache.dubbo.hessian2.api;
+
+//go package
+option go_package = "github.com/apache/dubbo-go-samples/java_interop/non-protobuf-dubbo/proto;greet";
+//java package
+option java_package = 'org.apache.dubbo.hessian2.api';
+option java_multiple_files = true;
+option java_outer_classname = "GreetingsService";
+option objc_class_prefix = "WH";
+
+import "hessian2_extend/hessian2_extend.proto";
+
+
+message GreetRequest {
+
+  string name = 1;
+
+  option (hessian2_extend.message_extend) = {
+    java_class_name: "org.apache.dubbo.hessian2.api.GreetRequest";
+  };
+}
+
+message GreetResponse {
+  string greeting = 1;
+  option (hessian2_extend.message_extend) = {
+    java_class_name: "org.apache.dubbo.hessian2.api.GreetResponse";
+  };
+}
+
+service GreetingsService  {
+  rpc Greet(GreetRequest) returns (GreetResponse) {
+    option (hessian2_extend.method_extend) = {
+      method_name: "greet";
+    };
+  }
+
+}
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/proto/hessian2_extend/hessian2_extend.proto b/java_interop/non-protobuf-dubbo/proto/hessian2_extend/hessian2_extend.proto
new file mode 100644
index 0000000..618ea19
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/hessian2_extend/hessian2_extend.proto
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package hessian2_extend;
+
+option go_package = "dubbo.apache.org/dubbo-go/v3/proto/hessian2_extend;hessian2_extend";
+
+import "google/protobuf/descriptor.proto";
+
+message Hessian2MessageOptions {
+  string java_class_name = 1;
+  string reference_path = 2;
+  bool is_inheritance = 3;
+  bool extend_args = 4;
+}
+
+extend google.protobuf.MessageOptions {
+  optional Hessian2MessageOptions message_extend = 12345;
+}
+
+message Hessian2MethodOptions {
+  string method_name = 1;
+}
+
+extend google.protobuf.MethodOptions {
+  optional Hessian2MethodOptions method_extend = 12345;
+}
+
+message Hessian2ServiceOptions {
+  string interface_name = 1;
+}
+
+extend google.protobuf.ServiceOptions {
+  optional Hessian2ServiceOptions service_extend = 12345;
+}
+
+message Hessian2EnumOptions {
+  string java_class_name = 1;
+}
+
+extend google.protobuf.EnumOptions {
+  optional Hessian2EnumOptions enum_extend = 12345;
+}
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/proto/java8_time/java8_time.proto b/java_interop/non-protobuf-dubbo/proto/java8_time/java8_time.proto
new file mode 100644
index 0000000..8f3cc58
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/java8_time/java8_time.proto
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package java8_time;
+
+option go_package = "dubbo.apache.org/dubbo-go/v3/proto/java8_time;java8_time";
+
+message Duration{}
+
+message Instant {}
+
+message LocalDate{}
+
+message LocalDateTime{}
+
+message LocalTime{}
+
+message MonthDay{}
+
+message OffsetDateTime{}
+
+message OffsetTime{}
+
+message Period{}
+
+message Year{}
+
+message YearMonth{}
+
+message ZoneOffSet{}
+
+message ZonedDateTime{}
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/proto/java_exception/java_exception.proto b/java_interop/non-protobuf-dubbo/proto/java_exception/java_exception.proto
new file mode 100644
index 0000000..74454ba
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/java_exception/java_exception.proto
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+syntax = "proto3";
+
+package java_exception;
+
+option go_package = "dubbo.apache.org/dubbo-go/v3/proto/java_exception;java_exception";
+
+message Exception {}
+
+message AnnotationTypeMismatchException {}
+
+message ArithmeticException {}
+
+message ArrayIndexOutOfBoundsException {}
+
+message ArrayStoreException {}
+
+message BackingStoreException {}
+
+message BrokenBarrierException {}
+
+message CancellationException {}
+
+message ClassNotFoundException {}
+
+message ClassCastException {}
+
+message CloneNotSupportedException {}
+
+message CompletionException {}
+
+message ConcurrentModificationException {}
+
+message DataFormatException {}
+
+message DateTimeException {}
+
+message DateTimeParseException {}
+
+message DubboGenericException {}
+
+message DuplicateFormatFlagsException {}
+
+message EmptyStackException {}
+
+message EnumConstantNotPresentException {}
+
+message EOFException {}
+
+message ExecutionException {}
+
+message FileNotFoundException {}
+
+message FormatterClosedException {}
+
+message IllegalAccessException {}
+
+message IllegalArgumentException {}
+
+message IllegalClassFormatException {}
+
+message IllegalFormatCodePointException {}
+
+message IllegalFormatConversionException {}
+
+message IllegalFormatFlagsException {}
+
+message IllegalFormatPrecisionException {}
+
+message IllegalFormatWidthException {}
+
+message IllegalMonitorStateException {}
+
+message IllegalStateException {}
+
+message IllegalThreadStateException {}
+
+message IllformedLocaleException {}
+
+message IncompleteAnnotationException {}
+
+message IndexOutOfBoundsException {}
+
+message InputMismatchException {}
+
+message InstantiationException {}
+
+message InterruptedException {}
+
+message InterruptedIOException {}
+
+message InvalidClassException {}
+
+message InvalidObjectException {}
+
+message InvalidPreferencesFormatException {}
+
+message InvalidPropertiesFormatException {}
+
+message InvocationTargetException {}
+
+message IOException {}
+
+message JarException {}
+
+message LambdaConversionException {}
+
+message MalformedParameterizedTypeException {}
+
+message MalformedParametersException {}
+
+message MissingFormatArgumentException {}
+
+message MissingFormatWidthException {}
+
+message MissingResourceException {}
+
+message NegativeArraySizeException {}
+
+message NoSuchElementException {}
+
+message NoSuchFieldException {}
+
+message NoSuchMethodException {}
+
+message NotActiveException {}
+
+message NotSerializableException {}
+
+message NullPointerException {}
+
+message NumberFormatException {}
+
+message ObjectStreamException {}
+
+message OptionalDataException {}
+
+message ReflectiveOperationException {}
+
+message RejectedExecutionException {}
+
+message RuntimeException {}
+
+message SecurityException {}
+
+message StreamCorruptedException {}
+
+message StringIndexOutOfBoundsException {}
+
+message SyncFailedException {}
+
+message TimeoutException {}
+
+message TooManyListenersException {}
+
+message TypeNotPresentException {}
+
+message UncheckedIOException {}
+
+message UndeclaredThrowableException {}
+
+message UnknownFormatConversionException {}
+
+message UnknownFormatFlagsException {}
+
+message UnmodifiableClassException {}
+
+message UnsupportedOperationException {}
+
+message UnsupportedTemporalTypeException {}
+
+message UTFDataFormatException {}
+
+message WriteAbortedException {}
+
+message WrongMethodTypeException {}
+
+message ZipException {}
+
+message ZoneRulesException{}
diff --git a/java_interop/non-protobuf-dubbo/proto/java_math/java_math.proto b/java_interop/non-protobuf-dubbo/proto/java_math/java_math.proto
new file mode 100644
index 0000000..342e820
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/java_math/java_math.proto
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package java_math;
+
+option go_package = "dubbo.apache.org/dubbo-go/v3/proto/java_math;java_math";
+
+message Decimal {}
+
+message Integer {}
diff --git a/java_interop/non-protobuf-dubbo/proto/java_sql_time/java_sql_time.proto b/java_interop/non-protobuf-dubbo/proto/java_sql_time/java_sql_time.proto
new file mode 100644
index 0000000..7e4f511
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/java_sql_time/java_sql_time.proto
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+package java_sql_time;
+
+option go_package = "dubbo.apache.org/dubbo-go/v3/proto/java_sql_time;java_sql_time";
+
+message Time {}
+
+message Date {}
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/proto/java_util/java_util.proto b/java_interop/non-protobuf-dubbo/proto/java_util/java_util.proto
new file mode 100644
index 0000000..3228cfc
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/java_util/java_util.proto
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+syntax = "proto3";
+
+package java_util;
+
+option go_package = "dubbo.apache.org/dubbo-go/v3/proto/java_util;java_util";
+
+message Locale {}
+
+message UUID {}
\ No newline at end of file
diff --git a/java_interop/non-protobuf-dubbo/proto/self_extension/self_extension.proto b/java_interop/non-protobuf-dubbo/proto/self_extension/self_extension.proto
new file mode 100644
index 0000000..03f600d
--- /dev/null
+++ b/java_interop/non-protobuf-dubbo/proto/self_extension/self_extension.proto
@@ -0,0 +1,15 @@
+syntax = "proto3";
+
+package self_extension;
+
+option go_package = "github.com/apache/dubbo-go-samples/java_interop/non-protobuf-triple/proto/self_extension;self_extension";
+
+import "google/protobuf/descriptor.proto";
+import "hessian2_extend/hessian2_extend.proto";
+
+message Time {
+  option (hessian2_extend.message_extend) = {
+    java_class_name: "java.sql.Time";
+    reference_path: "dubbo.apache.org/dubbo-go/v3/proto/java_sql_time";
+  };
+}
\ No newline at end of file
diff --git a/java_interop/non-protobuf-triple.zip b/java_interop/non-protobuf-triple.zip
new file mode 100644
index 0000000..e448f01
--- /dev/null
+++ b/java_interop/non-protobuf-triple.zip
Binary files differ
diff --git a/java_interop/non-protobuf-triple/README.md b/java_interop/non-protobuf-triple/README.md
index e728f8c..07cff1c 100644
--- a/java_interop/non-protobuf-triple/README.md
+++ b/java_interop/non-protobuf-triple/README.md
@@ -1,3 +1,31 @@
 # Dubbo java and go interoperability, non-protobuf and triple protocol
 
-Please refer to [Multiple Protocols](https://github.com/apache/dubbo-go-samples/tree/main/rpc/multi-protocols) for how to write non-protobuf style protocol.
\ No newline at end of file
+Please refer to [Multiple Protocols](https://github.com/apache/dubbo-go-samples/tree/main/rpc/multi-protocols) for how to write non-protobuf style protocol.
+
+# Run
+
+## Java
+
+client
+```bash
+# in directory java-client
+mvn -e clean compile exec:java -Dexec.mainClass="org.apache.dubbo.tri.hessian2.client.Application"
+```
+
+server
+```bash
+# in directory java-server
+mvn -e clean compile exec:java -Dexec.mainClass="org.apache.dubbo.tri.hessian2.provider.Application"
+```
+
+## go
+
+client
+```bash
+go run go-client/client.go
+```
+
+server
+```bash
+go run go-server/server.go
+```
diff --git a/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/api/GreetingsService.java b/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/api/GreetingsService.java
index e0a3d06..ddfb687 100644
--- a/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/api/GreetingsService.java
+++ b/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/api/GreetingsService.java
@@ -18,5 +18,5 @@
 package org.apache.dubbo.tri.hessian2.api;
 
 public interface GreetingsService {
-    GreetResponse Greet(GreetRequest req);
+    GreetResponse greet(GreetRequest req);
 }
diff --git a/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/client/Application.java b/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/client/Application.java
index 66cc7ab..c4cddb6 100644
--- a/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/client/Application.java
+++ b/java_interop/non-protobuf-triple/java-client/src/main/java/org/apache/dubbo/tri/hessian2/client/Application.java
@@ -37,7 +37,7 @@
 
         GreetRequest request = new GreetRequest();
         request.setName("world");
-        String message = service.Greet(request).getGreeting();
+        String message = service.greet(request).getGreeting();
 
         System.out.println("Receive result ======> " + message);
         System.in.read();
diff --git a/java_interop/service_discovery/service/java-server/src/main/resources/application.yml b/java_interop/service_discovery/service/java-server/src/main/resources/application.yml
index 184838f..4a02a6c 100644
--- a/java_interop/service_discovery/service/java-server/src/main/resources/application.yml
+++ b/java_interop/service_discovery/service/java-server/src/main/resources/application.yml
@@ -18,6 +18,7 @@
   application:
     name: greet-java-server
     logger: slf4j
+    metadataServiceProtocol: dubbo # required, dubbo-go not support tri
   protocol:
     name: tri
     port: 20055
diff --git a/online_boutique_demo/kubernetes-manifests/README.md b/online_boutique_demo/kubernetes-manifests/README.md
deleted file mode 100644
index ed852b7..0000000
--- a/online_boutique_demo/kubernetes-manifests/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# ./kubernetes-manifests
-
-:warning: Kubernetes manifests provided in this directory are not directly
-deployable to a cluster. They are meant to be used with `skaffold` command to
-insert the correct `image:` tags.
-
-Use the manifests in [/release](/release) directory which are configured with
-pre-built public images.
diff --git a/online_boutique_demo/kubernetes-manifests/adservice.yaml b/online_boutique_demo/kubernetes-manifests/adservice.yaml
deleted file mode 100644
index f6ab0a2..0000000
--- a/online_boutique_demo/kubernetes-manifests/adservice.yaml
+++ /dev/null
@@ -1,59 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: adservice
-spec:
-  selector:
-    matchLabels:
-      app: adservice
-  template:
-    metadata:
-      labels:
-        app: adservice
-    spec:
-      serviceAccountName: go-micro 
-      terminationGracePeriodSeconds: 5
-      containers:
-        - name: server
-          image: adservice
-          ports:
-            - containerPort: 9555
-          env:
-            - name: PORT
-              value: "9555"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
-          readinessProbe:
-            initialDelaySeconds: 20
-            periodSeconds: 15
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:9555"]
-          livenessProbe:
-            initialDelaySeconds: 20
-            periodSeconds: 15
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:9555"]
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: adservice
-spec:
-  type: ClusterIP
-  selector:
-    app: adservice
-  ports:
-    - name: grpc
-      port: 9555
-      targetPort: 9555
diff --git a/online_boutique_demo/kubernetes-manifests/cartservice.yaml b/online_boutique_demo/kubernetes-manifests/cartservice.yaml
deleted file mode 100644
index fcb551b..0000000
--- a/online_boutique_demo/kubernetes-manifests/cartservice.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: cartservice
-spec:
-  selector:
-    matchLabels:
-      app: cartservice
-  template:
-    metadata:
-      labels:
-        app: cartservice
-    spec:
-      serviceAccountName: go-micro 
-      terminationGracePeriodSeconds: 5
-      securityContext:
-        fsGroup: 1000
-        runAsGroup: 1000
-        runAsNonRoot: true
-        runAsUser: 1000
-      containers:
-        - name: server
-          securityContext:
-            allowPrivilegeEscalation: false
-            capabilities:
-              drop:
-                - all
-            privileged: false
-            readOnlyRootFilesystem: true
-          image: cartservice
-          ports:
-            - containerPort: 7070
-          env:
-            - name: PORT
-              value: "7070"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: REDIS_ADDR
-              value: "redis-cart:6379"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
-          readinessProbe:
-            initialDelaySeconds: 15
-            exec:
-              command:
-                ["/bin/grpc_health_probe", "-addr=:7070", "-rpc-timeout=5s"]
-          livenessProbe:
-            initialDelaySeconds: 15
-            periodSeconds: 10
-            exec:
-              command:
-                ["/bin/grpc_health_probe", "-addr=:7070", "-rpc-timeout=5s"]
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: cartservice
-spec:
-  type: ClusterIP
-  selector:
-    app: cartservice
-  ports:
-    - name: grpc
-      port: 7070
-      targetPort: 7070
diff --git a/online_boutique_demo/kubernetes-manifests/checkoutservice.yaml b/online_boutique_demo/kubernetes-manifests/checkoutservice.yaml
deleted file mode 100644
index 4b12be3..0000000
--- a/online_boutique_demo/kubernetes-manifests/checkoutservice.yaml
+++ /dev/null
@@ -1,66 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: checkoutservice
-spec:
-  selector:
-    matchLabels:
-      app: checkoutservice
-  template:
-    metadata:
-      labels:
-        app: checkoutservice
-    spec:
-      serviceAccountName: go-micro
-      containers:
-        - name: server
-          image: checkoutservice
-          ports:
-            - containerPort: 5050
-          readinessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:5050"]
-          livenessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:5050"]
-          env:
-            - name: PORT
-              value: "5050"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: PRODUCTCATALOGSERVICE
-              value: "productcatalogservice"
-            - name: SHIPPINGSERVICE
-              value: "shippingservice"
-            - name: PAYMENTSERVICE
-              value: "paymentservice"
-            - name: EMAILSERVICE
-              value: "emailservice"
-            - name: CURRENCYSERVICE
-              value: "currencyservice"
-            - name: CARTSERVICE
-              value: "cartservice"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: checkoutservice
-spec:
-  type: ClusterIP
-  selector:
-    app: checkoutservice
-  ports:
-    - name: grpc
-      port: 5050
-      targetPort: 5050
diff --git a/online_boutique_demo/kubernetes-manifests/currencyservice.yaml b/online_boutique_demo/kubernetes-manifests/currencyservice.yaml
deleted file mode 100644
index f609d26..0000000
--- a/online_boutique_demo/kubernetes-manifests/currencyservice.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: currencyservice
-spec:
-  selector:
-    matchLabels:
-      app: currencyservice
-  template:
-    metadata:
-      labels:
-        app: currencyservice
-    spec:
-      serviceAccountName: go-micro 
-      terminationGracePeriodSeconds: 5
-      containers:
-        - name: server
-          image: currencyservice
-          ports:
-            - name: grpc
-              containerPort: 7000
-          env:
-            - name: PORT
-              value: "7000"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          readinessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:7000"]
-          livenessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:7000"]
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: currencyservice
-spec:
-  type: ClusterIP
-  selector:
-    app: currencyservice
-  ports:
-    - name: grpc
-      port: 7000
-      targetPort: 7000
diff --git a/online_boutique_demo/kubernetes-manifests/emailservice.yaml b/online_boutique_demo/kubernetes-manifests/emailservice.yaml
deleted file mode 100644
index 8f1be59..0000000
--- a/online_boutique_demo/kubernetes-manifests/emailservice.yaml
+++ /dev/null
@@ -1,57 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: emailservice
-spec:
-  selector:
-    matchLabels:
-      app: emailservice
-  template:
-    metadata:
-      labels:
-        app: emailservice
-    spec:
-      serviceAccountName: go-micro 
-      terminationGracePeriodSeconds: 5
-      containers:
-        - name: server
-          image: emailservice
-          ports:
-            - containerPort: 8080
-          env:
-            - name: PORT
-              value: "8080"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          readinessProbe:
-            periodSeconds: 5
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:8080"]
-          livenessProbe:
-            periodSeconds: 5
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:8080"]
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: emailservice
-spec:
-  type: ClusterIP
-  selector:
-    app: emailservice
-  ports:
-    - name: grpc
-      port: 5000
-      targetPort: 8080
diff --git a/online_boutique_demo/kubernetes-manifests/frontend.yaml b/online_boutique_demo/kubernetes-manifests/frontend.yaml
deleted file mode 100644
index 1215f6c..0000000
--- a/online_boutique_demo/kubernetes-manifests/frontend.yaml
+++ /dev/null
@@ -1,99 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: frontend
-spec:
-  selector:
-    matchLabels:
-      app: frontend
-  template:
-    metadata:
-      labels:
-        app: frontend
-      annotations:
-        sidecar.istio.io/rewriteAppHTTPProbers: "true"
-    spec:
-      serviceAccountName: go-micro 
-      containers:
-        - name: server
-          image: frontend
-          ports:
-            - containerPort: 8080
-          readinessProbe:
-            initialDelaySeconds: 10
-            httpGet:
-              path: "/_healthz"
-              port: 8080
-              httpHeaders:
-                - name: "Cookie"
-                  value: "shop_session-id=x-readiness-probe"
-          livenessProbe:
-            initialDelaySeconds: 10
-            httpGet:
-              path: "/_healthz"
-              port: 8080
-              httpHeaders:
-                - name: "Cookie"
-                  value: "shop_session-id=x-liveness-probe"
-          env:
-            - name: ADDRESS 
-              value: ":8080"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: PRODUCTCATALOGSERVICE
-              value: "productcatalogservice"
-            - name: CURRENCYSERVICE
-              value: "currencyservice"
-            - name: CARTSERVICE
-              value: "cartservice"
-            - name: RECOMMENDATIONSERVICE
-              value: "recommendationservice"
-            - name: SHIPPINGSERVICE
-              value: "shippingservice"
-            - name: CHECKOUTSERVICE
-              value: "checkoutservice"
-            - name: ADSERVICE
-              value: "adservice"
-            # # ENV_PLATFORM: One of: local, gcp, aws, azure, onprem, alibaba
-            # # When not set, defaults to "local" unless running in GKE, otherwies auto-sets to gcp
-            # - name: ENV_PLATFORM
-            #   value: "aws"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-            # - name: CYMBAL_BRANDING
-            #   value: "true"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: frontend
-spec:
-  type: ClusterIP
-  selector:
-    app: frontend
-  ports:
-    - name: http
-      port: 80
-      targetPort: 8080
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: frontend-external
-spec:
-  type: LoadBalancer
-  selector:
-    app: frontend
-  ports:
-    - name: http
-      port: 80
-      targetPort: 8080
diff --git a/online_boutique_demo/kubernetes-manifests/gomicro.yaml b/online_boutique_demo/kubernetes-manifests/gomicro.yaml
deleted file mode 100644
index 04c9314..0000000
--- a/online_boutique_demo/kubernetes-manifests/gomicro.yaml
+++ /dev/null
@@ -1,86 +0,0 @@
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: go-micro
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
-  name: go-micro-registry
-rules:
-  - apiGroups:
-      - ""
-    resources:
-      - pods
-    verbs:
-      - list
-      - patch
-      - watch
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
-  name: go-micro-registry
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: go-micro-registry
-subjects:
-  - kind: ServiceAccount
-    name: go-micro
----
-kind: Deployment
-apiVersion: apps/v1
-metadata:
-  name: go-micro-dashboard
-  labels:
-    app: go-micro-dashboard
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: go-micro-dashboard
-  template:
-    metadata:
-      labels:
-        app: go-micro-dashboard
-    spec:
-      serviceAccountName: go-micro
-      containers:
-        - image: xpunch/go-micro-dashboard:latest
-          imagePullPolicy: IfNotPresent
-          name: dashboard
-          ports:
-            - containerPort: 80
-              protocol: TCP
-          env:
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: MICRO_CLIENT_RETRIES
-              value: "0"
-            - name: SERVER_ADDRESS
-              value: ":80"
-            - name: SERVER_AUTH_USERNAME
-              value: "admin"
-            - name: SERVER_AUTH_PASSWORD
-              value: "micro"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: go-micro-dashboard
-spec:
-  type: ClusterIP
-  selector:
-    app: go-micro-dashboard
-  ports:
-    - name: web
-      port: 80
-      targetPort: 80
\ No newline at end of file
diff --git a/online_boutique_demo/kubernetes-manifests/loadgenerator.yaml b/online_boutique_demo/kubernetes-manifests/loadgenerator.yaml
deleted file mode 100644
index c762a41..0000000
--- a/online_boutique_demo/kubernetes-manifests/loadgenerator.yaml
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2018 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: loadgenerator
-spec:
-  selector:
-    matchLabels:
-      app: loadgenerator
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: loadgenerator
-      annotations:
-        sidecar.istio.io/rewriteAppHTTPProbers: "true"
-    spec:
-      serviceAccountName: go-micro 
-      terminationGracePeriodSeconds: 5
-      restartPolicy: Always
-      initContainers:
-        - command:
-            - /bin/sh
-            - -exc
-            - |
-              echo "Init container pinging frontend: ${FRONTEND_ADDR}..."
-              STATUSCODE=$(wget --server-response http://${FRONTEND_ADDR} 2>&1 | awk '/^  HTTP/{print $2}')
-              if test $STATUSCODE -ne 200; then
-                  echo "Error: Could not reach frontend - Status code: ${STATUSCODE}"
-                  exit 1
-              fi
-          name: frontend-check
-          image: busybox:latest
-          env:
-            - name: FRONTEND_ADDR
-              value: "frontend:80"
-      containers:
-        - name: main
-          image: loadgenerator
-          env:
-            - name: FRONTEND_ADDR
-              value: "frontend:80"
-            - name: USERS
-              value: "10"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
diff --git a/online_boutique_demo/kubernetes-manifests/paymentservice.yaml b/online_boutique_demo/kubernetes-manifests/paymentservice.yaml
deleted file mode 100644
index f964367..0000000
--- a/online_boutique_demo/kubernetes-manifests/paymentservice.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2018 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: paymentservice
-spec:
-  selector:
-    matchLabels:
-      app: paymentservice
-  template:
-    metadata:
-      labels:
-        app: paymentservice
-    spec:
-      serviceAccountName: go-micro 
-      terminationGracePeriodSeconds: 5
-      containers:
-        - name: server
-          image: paymentservice
-          ports:
-            - containerPort: 50051
-          env:
-            - name: PORT
-              value: "50051"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          readinessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:50051"]
-          livenessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:50051"]
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: paymentservice
-spec:
-  type: ClusterIP
-  selector:
-    app: paymentservice
-  ports:
-    - name: grpc
-      port: 50051
-      targetPort: 50051
diff --git a/online_boutique_demo/kubernetes-manifests/productcatalogservice.yaml b/online_boutique_demo/kubernetes-manifests/productcatalogservice.yaml
deleted file mode 100644
index 662316a..0000000
--- a/online_boutique_demo/kubernetes-manifests/productcatalogservice.yaml
+++ /dev/null
@@ -1,55 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: productcatalogservice
-spec:
-  selector:
-    matchLabels:
-      app: productcatalogservice
-  template:
-    metadata:
-      labels:
-        app: productcatalogservice
-    spec:
-      serviceAccountName: go-micro
-      terminationGracePeriodSeconds: 5
-      containers:
-        - name: server
-          image: productcatalogservice
-          ports:
-            - containerPort: 3550
-          env:
-            - name: PORT
-              value: "3550"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          readinessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:3550"]
-          livenessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:3550"]
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: productcatalogservice
-spec:
-  type: ClusterIP
-  selector:
-    app: productcatalogservice
-  ports:
-    - name: grpc
-      port: 3550
-      targetPort: 3550
diff --git a/online_boutique_demo/kubernetes-manifests/recommendationservice.yaml b/online_boutique_demo/kubernetes-manifests/recommendationservice.yaml
deleted file mode 100644
index 7d4edf8..0000000
--- a/online_boutique_demo/kubernetes-manifests/recommendationservice.yaml
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2018 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: recommendationservice
-spec:
-  selector:
-    matchLabels:
-      app: recommendationservice
-  template:
-    metadata:
-      labels:
-        app: recommendationservice
-    spec:
-      serviceAccountName: go-micro
-      terminationGracePeriodSeconds: 5
-      containers:
-        - name: server
-          image: recommendationservice
-          ports:
-            - containerPort: 8080
-          readinessProbe:
-            periodSeconds: 5
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:8080"]
-          livenessProbe:
-            periodSeconds: 5
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:8080"]
-          env:
-            - name: PORT
-              value: "8080"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: PRODUCTCATALOGSERVICE
-              value: "productcatalogservice"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: recommendationservice
-spec:
-  type: ClusterIP
-  selector:
-    app: recommendationservice
-  ports:
-    - name: grpc
-      port: 8080
-      targetPort: 8080
diff --git a/online_boutique_demo/kubernetes-manifests/redis.yaml b/online_boutique_demo/kubernetes-manifests/redis.yaml
deleted file mode 100644
index 6496658..0000000
--- a/online_boutique_demo/kubernetes-manifests/redis.yaml
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2018 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: redis-cart
-spec:
-  selector:
-    matchLabels:
-      app: redis-cart
-  template:
-    metadata:
-      labels:
-        app: redis-cart
-    spec:
-      containers:
-        - name: redis
-          image: redis:alpine
-          ports:
-            - containerPort: 6379
-          readinessProbe:
-            periodSeconds: 5
-            tcpSocket:
-              port: 6379
-          livenessProbe:
-            periodSeconds: 5
-            tcpSocket:
-              port: 6379
-          volumeMounts:
-            - mountPath: /data
-              name: redis-data
-          resources:
-            limits:
-              memory: 256Mi
-              cpu: 125m
-            requests:
-              cpu: 70m
-              memory: 200Mi
-      volumes:
-        - name: redis-data
-          emptyDir: {}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: redis-cart
-spec:
-  type: ClusterIP
-  selector:
-    app: redis-cart
-  ports:
-    - name: tls-redis
-      port: 6379
-      targetPort: 6379
diff --git a/online_boutique_demo/kubernetes-manifests/shippingservice.yaml b/online_boutique_demo/kubernetes-manifests/shippingservice.yaml
deleted file mode 100644
index 953a8cb..0000000
--- a/online_boutique_demo/kubernetes-manifests/shippingservice.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2018 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: shippingservice
-spec:
-  selector:
-    matchLabels:
-      app: shippingservice
-  template:
-    metadata:
-      labels:
-        app: shippingservice
-    spec:
-      serviceAccountName: go-micro
-      containers:
-        - name: server
-          image: shippingservice
-          ports:
-            - containerPort: 50051
-          env:
-            - name: PORT
-              value: "50051"
-            - name: MICRO_REGISTRY
-              value: "kubernetes"
-            - name: TRACING_ENABLE
-              value: "true"
-            - name: TRACING_JAEGER_URL
-              value: "http://jaeger-collector.default.svc.cluster.local:14268/api/traces"
-          readinessProbe:
-            periodSeconds: 5
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:50051"]
-          livenessProbe:
-            exec:
-              command: ["/bin/grpc_health_probe", "-addr=:50051"]
-          # resources:
-          #   requests:
-          #     cpu: 100m
-          #     memory: 64Mi
-          #   limits:
-          #     cpu: 200m
-          #     memory: 128Mi
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: shippingservice
-spec:
-  type: ClusterIP
-  selector:
-    app: shippingservice
-  ports:
-    - name: grpc
-      port: 50051
-      targetPort: 50051
diff --git a/online_boutique_demo/release/kubernetes-manifests.yaml b/online_boutique_demo/release/kubernetes-manifests.yaml
index 7ce7600..e58e895 100644
--- a/online_boutique_demo/release/kubernetes-manifests.yaml
+++ b/online_boutique_demo/release/kubernetes-manifests.yaml
@@ -31,11 +31,11 @@
       labels:
         app: emailservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-emailservice:v1.0.0
+          image: xpunch/dubbo-go-demo-emailservice:v1.0.0
           ports:
             - containerPort: 8080
           env:
@@ -87,10 +87,10 @@
       labels:
         app: checkoutservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       containers:
         - name: server
-          image: xpunch/go-micro-demo-checkoutservice:v1.0.0
+          image: xpunch/dubbo-go-demo-checkoutservice:v1.0.0
           ports:
             - containerPort: 5050
           readinessProbe:
@@ -156,11 +156,11 @@
       labels:
         app: recommendationservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-recommendationservice:v1.0.0
+          image: xpunch/dubbo-go-demo-recommendationservice:v1.0.0
           ports:
             - containerPort: 8080
           readinessProbe:
@@ -218,10 +218,10 @@
       annotations:
         sidecar.istio.io/rewriteAppHTTPProbers: "true"
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       containers:
         - name: server
-          image: xpunch/go-micro-demo-frontend:v1.0.0
+          image: xpunch/dubbo-go-demo-frontend:v1.0.0
           ports:
             - containerPort: 8080
           readinessProbe:
@@ -258,7 +258,7 @@
             - name: AD_SERVICE_ADDR
               value: "adservice:9555"
             # # ENV_PLATFORM: One of: local, gcp, aws, azure, onprem, alibaba
-            # # When not set, go-micros to "local" unless running in GKE, otherwies auto-sets to gcp
+            # # When not set, dubbo-gos to "local" unless running in GKE, otherwies auto-sets to gcp
             # - name: ENV_PLATFORM
             #   value: "aws"
             - name: DISABLE_TRACING
@@ -316,11 +316,11 @@
       labels:
         app: paymentservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-paymentservice:v1.0.0
+          image: xpunch/dubbo-go-demo-paymentservice:v1.0.0
           ports:
             - containerPort: 50051
           env:
@@ -372,11 +372,11 @@
       labels:
         app: productcatalogservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-productcatalogservice:v1.0.0
+          image: xpunch/dubbo-go-demo-productcatalogservice:v1.0.0
           ports:
             - containerPort: 3550
           env:
@@ -430,11 +430,11 @@
       labels:
         app: cartservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-cartservice:v1.0.0
+          image: xpunch/dubbo-go-demo-cartservice:v1.0.0
           imagePullPolicy: Never
           ports:
             - containerPort: 7070
@@ -489,7 +489,7 @@
       annotations:
         sidecar.istio.io/rewriteAppHTTPProbers: "true"
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       restartPolicy: Always
       initContainers:
@@ -537,11 +537,11 @@
       labels:
         app: currencyservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-currencyservice:v1.0.0
+          image: xpunch/dubbo-go-demo-currencyservice:v1.0.0
           ports:
             - name: grpc
               containerPort: 7000
@@ -594,10 +594,10 @@
       labels:
         app: shippingservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       containers:
         - name: server
-          image: xpunch/go-micro-demo-shippingservice:v1.0.0
+          image: xpunch/dubbo-go-demo-shippingservice:v1.0.0
           ports:
             - containerPort: 50051
           env:
@@ -705,11 +705,11 @@
       labels:
         app: adservice
     spec:
-      serviceAccountName: go-micro
+      serviceAccountName: dubbo-go
       terminationGracePeriodSeconds: 5
       containers:
         - name: server
-          image: xpunch/go-micro-demo-adservice:v1.0.0
+          image: xpunch/dubbo-go-demo-adservice:v1.0.0
           ports:
             - containerPort: 9555
           env:
diff --git a/online_boutique_demo/skaffold.yaml b/online_boutique_demo/skaffold.yaml
deleted file mode 100644
index 6fa09f6..0000000
--- a/online_boutique_demo/skaffold.yaml
+++ /dev/null
@@ -1,79 +0,0 @@
-apiVersion: skaffold/v2beta27
-kind: Config
-metadata:
-  name: hipstershop
-build:
-  artifacts:
-    # image tags are relative; to specify an image repo (e.g. GCR), you
-    # must provide a "default repo" using one of the methods described
-    # here:
-    # https://skaffold.dev/docs/concepts/#image-repository-handling
-    - image: emailservice
-      context: src/emailservice
-    - image: productcatalogservice
-      context: src/productcatalogservice
-    - image: recommendationservice
-      context: src/recommendationservice
-    - image: shippingservice
-      context: src/shippingservice
-    - image: checkoutservice
-      context: src/checkoutservice
-    - image: paymentservice
-      context: src/paymentservice
-    - image: currencyservice
-      context: src/currencyservice
-    - image: cartservice
-      context: src/cartservice
-      docker:
-        dockerfile: Dockerfile
-    - image: frontend
-      context: src/frontend
-    - image: adservice
-      context: src/adservice
-  tagPolicy:
-    gitCommit: {}
-  local:
-    useBuildkit: false
-    concurrency: 10
-deploy:
-  kubectl:
-    manifests:
-      - ./kubernetes-manifests/adservice.yaml
-      - ./kubernetes-manifests/cartservice.yaml
-      - ./kubernetes-manifests/checkoutservice.yaml
-      - ./kubernetes-manifests/currencyservice.yaml
-      - ./kubernetes-manifests/emailservice.yaml
-      - ./kubernetes-manifests/frontend.yaml
-      - ./kubernetes-manifests/paymentservice.yaml
-      - ./kubernetes-manifests/productcatalogservice.yaml
-      - ./kubernetes-manifests/recommendationservice.yaml
-      - ./kubernetes-manifests/shippingservice.yaml
-      - ./kubernetes-manifests/gomicro.yaml
-# profiles:
-#   # "debug" profile replaces the default Dockerfile in cartservice with Dockerfile.debug,
-#   # which enables debugging via skaffold.
-#   #
-#   # This profile is used by default when running skaffold debug.
-#   - name: debug
-#     activation:
-#       - command: debug
-#     patches:
-#       - op: replace
-#         path: /build/artifacts/7/docker/dockerfile
-#         value: Dockerfile.debug
-
----
-apiVersion: skaffold/v2beta27
-kind: Config
-metadata:
-  name: loadgenerator
-requires:
-  - configs: [hipstershop]
-build:
-  artifacts:
-    - image: loadgenerator
-      context: src/loadgenerator
-deploy:
-  kubectl:
-    manifests:
-      - ./kubernetes-manifests/loadgenerator.yaml
diff --git a/online_boutique_demo/src/adservive/Dockerfile b/online_boutique_demo/src/adservive/Dockerfile
new file mode 100644
index 0000000..8247d6f
--- /dev/null
+++ b/online_boutique_demo/src/adservive/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/adservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/adservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/adservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/adservive/Makefile b/online_boutique_demo/src/adservive/Makefile
new file mode 100644
index 0000000..2c392a1
--- /dev/null
+++ b/online_boutique_demo/src/adservive/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o adservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t adservice:latest .
+	@docker tag adservice:latest xpunch/dubbo-go-demo-adservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-adservice:v1.0.0
diff --git a/online_boutique_demo/src/cartservice/Dockerfile b/online_boutique_demo/src/cartservice/Dockerfile
new file mode 100644
index 0000000..7bc8daa
--- /dev/null
+++ b/online_boutique_demo/src/cartservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/cartservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/cartservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/cartservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/cartservice/Makefile b/online_boutique_demo/src/cartservice/Makefile
new file mode 100644
index 0000000..1411cd1
--- /dev/null
+++ b/online_boutique_demo/src/cartservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o cartservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t cartservice:latest .
+	@docker tag cartservice:latest xpunch/dubbo-go-demo-cartservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-cartservice:v1.0.0
diff --git a/online_boutique_demo/src/checkoutservice/Dockerfile b/online_boutique_demo/src/checkoutservice/Dockerfile
new file mode 100644
index 0000000..050f3f4
--- /dev/null
+++ b/online_boutique_demo/src/checkoutservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/checkoutservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/checkoutservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/checkoutservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/checkoutservice/Makefile b/online_boutique_demo/src/checkoutservice/Makefile
new file mode 100644
index 0000000..7893676
--- /dev/null
+++ b/online_boutique_demo/src/checkoutservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o checkoutservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t checkoutservice:latest .
+	@docker tag checkoutservice:latest xpunch/dubbo-go-demo-checkoutservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-checkoutservice:v1.0.0
diff --git a/online_boutique_demo/src/currencyservice/Dockerfile b/online_boutique_demo/src/currencyservice/Dockerfile
new file mode 100644
index 0000000..b584c2a
--- /dev/null
+++ b/online_boutique_demo/src/currencyservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/currencyservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/currencyservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/currencyservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/currencyservice/Makefile b/online_boutique_demo/src/currencyservice/Makefile
new file mode 100644
index 0000000..8ae3272
--- /dev/null
+++ b/online_boutique_demo/src/currencyservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o currencyservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t currencyservice:latest .
+	@docker tag currencyservice:latest xpunch/dubbo-go-demo-currencyservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-currencyservice:v1.0.0
diff --git a/online_boutique_demo/src/emailservice/Dockerfile b/online_boutique_demo/src/emailservice/Dockerfile
new file mode 100644
index 0000000..a7fa6a8
--- /dev/null
+++ b/online_boutique_demo/src/emailservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/emailservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/emailservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/emailservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/emailservice/Makefile b/online_boutique_demo/src/emailservice/Makefile
new file mode 100644
index 0000000..598369a
--- /dev/null
+++ b/online_boutique_demo/src/emailservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o emailservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t emailservice:latest .
+	@docker tag emailservice:latest xpunch/dubbo-go-demo-emailservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-emailservice:v1.0.0
diff --git a/online_boutique_demo/src/frontend/Dockerfile b/online_boutique_demo/src/frontend/Dockerfile
new file mode 100644
index 0000000..2368496
--- /dev/null
+++ b/online_boutique_demo/src/frontend/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/frontendservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/frontendservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/frontendservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/frontend/Makefile b/online_boutique_demo/src/frontend/Makefile
new file mode 100644
index 0000000..dcf8183
--- /dev/null
+++ b/online_boutique_demo/src/frontend/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o frontendservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t frontendservice:latest .
+	@docker tag frontendservice:latest xpunch/dubbo-go-demo-frontendservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-frontendservice:v1.0.0
diff --git a/online_boutique_demo/src/paymentservice/Dockerfile b/online_boutique_demo/src/paymentservice/Dockerfile
new file mode 100644
index 0000000..c2df2d6
--- /dev/null
+++ b/online_boutique_demo/src/paymentservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/paymentservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/paymentservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/paymentservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/paymentservice/Makefile b/online_boutique_demo/src/paymentservice/Makefile
new file mode 100644
index 0000000..5ed8ed2
--- /dev/null
+++ b/online_boutique_demo/src/paymentservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o paymentservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t paymentservice:latest .
+	@docker tag paymentservice:latest xpunch/dubbo-go-demo-paymentservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-paymentservice:v1.0.0
diff --git a/online_boutique_demo/src/productcatalogservice/Dockerfile b/online_boutique_demo/src/productcatalogservice/Dockerfile
new file mode 100644
index 0000000..366c0e1
--- /dev/null
+++ b/online_boutique_demo/src/productcatalogservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/productcatalogservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/productcatalogservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/productcatalogservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/productcatalogservice/Makefile b/online_boutique_demo/src/productcatalogservice/Makefile
new file mode 100644
index 0000000..93aa2f8
--- /dev/null
+++ b/online_boutique_demo/src/productcatalogservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o productcatalogservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t productcatalogservice:latest .
+	@docker tag productcatalogservice:latest xpunch/dubbo-go-demo-productcatalogservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-productcatalogservice:v1.0.0
diff --git a/online_boutique_demo/src/recommendationservice/Dockerfile b/online_boutique_demo/src/recommendationservice/Dockerfile
new file mode 100644
index 0000000..86d3d90
--- /dev/null
+++ b/online_boutique_demo/src/recommendationservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/recommendationservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/recommendationservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/recommendationservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/recommendationservice/Makefile b/online_boutique_demo/src/recommendationservice/Makefile
new file mode 100644
index 0000000..26e0c5c
--- /dev/null
+++ b/online_boutique_demo/src/recommendationservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o recommendationservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t recommendationservice:latest .
+	@docker tag recommendationservice:latest xpunch/dubbo-go-demo-recommendationservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-recommendationservice:v1.0.0
diff --git a/online_boutique_demo/src/shippingservice/Dockerfile b/online_boutique_demo/src/shippingservice/Dockerfile
new file mode 100644
index 0000000..9c4b5d4
--- /dev/null
+++ b/online_boutique_demo/src/shippingservice/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.20.0-alpine AS builder
+
+# Set Go env
+ENV CGO_ENABLED=0 GOOS=linux
+WORKDIR /go/src/hipstershop
+
+# Install dependencies
+RUN apk --update --no-cache add ca-certificates make
+
+# Download grpc_health_probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.4.11 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# Build Go binary
+COPY Makefile go.mod go.sum ./
+RUN go env -w GOPROXY=https://goproxy.io,direct/
+RUN make init && go mod download
+COPY . .
+
+
+RUN go build -o /go/src/hipstershop/shippingservice .
+
+# Deployment container
+FROM scratch
+
+WORKDIR /hipstershop
+
+# Definition of this variable is used by 'skaffold debug' to identify a golang binary.
+# Default behavior - a failure prints a stack trace for the current goroutine.
+# See https://golang.org/pkg/runtime/
+ENV GOTRACEBACK=single
+COPY --from=builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=builder /bin/grpc_health_probe /bin/
+COPY --from=builder /go/src/hipstershop/shippingservice /hipstershop/
+
+ENTRYPOINT ["/hipstershop/shippingservice"]
\ No newline at end of file
diff --git a/online_boutique_demo/src/shippingservice/Makefile b/online_boutique_demo/src/shippingservice/Makefile
new file mode 100644
index 0000000..e40551c
--- /dev/null
+++ b/online_boutique_demo/src/shippingservice/Makefile
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+GOPATH:=$(shell go env GOPATH)
+
+.PHONY: init
+init:
+	@go get -u google.golang.org/protobuf/proto
+	@go install github.com/golang/protobuf/protoc-gen-go@latest
+
+.PHONY: update
+update:
+	@go get -u
+
+.PHONY: tidy
+tidy:
+	@go mod tidy
+
+.PHONY: build
+build:
+	@go build -o shippingservice *.go
+
+.PHONY: docker
+docker:
+	@docker build -t shippingservice:latest .
+	@docker tag shippingservice:latest xpunch/dubbo-go-demo-shippingservice:v1.0.0
+	@docker push xpunch/dubbo-go-demo-shippingservice:v1.0.0