微服务环境搭建

微服务

Spring Boot
Spring Cloud
dubbo

SpringBoot

环境创建

1:新建项目或者模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaVUjXwm-1647763663008)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018233221483.png)]

选择 设置 依赖

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRFRHtbZ-1647763663012)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018233459432.png)]

目录结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGMKfqpW-1647763663013)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018233939262.png)]

maven配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zz0LBlOO-1647763663014)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018234101254.png)]

web示例

首先在项目里依次创建controller、service、dao、entity

controller包里创建HelloController

package com.example.springboot_demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @RequestMapping("/index")
    public String sayHello() {
        return "hello world,my first spring boot demo";
    }
}

修改application.propertiesapplication.yml
编辑application.yml

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://192.168.0.103:3306/mysql
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true

运行项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhcPifun-1647763663015)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018234933994.png)]

测试HelloController类是否运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49OxEMAP-1647763663016)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018235336702.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYvFkBSP-1647763663016)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211018235758024.png)]

测试类方法:getUserEntityByName

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dD3i2BnX-1647763663017)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019001110550.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2awzD8re-1647763663018)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019001006604.png)]

测试类方法:getAllUser

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kteb5cqT-1647763663019)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019001209823.png)]

再次运行项目,浏览器访问IP:8080/getusers

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdh6KX2w-1647763663019)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019001759660.png)]

http://localhost:8080/getusers
[
    {
        "id":1,
        "name":"wang",
        "password":"123456"
    },
      ......
    {
        "id":4,
        "name":"wangcheng",
        "password":"000000"
    },
    {
        "id":5,
        "name":"user01",
        "password":"test123456"
    }
]

打包部署

先执行maven clean,再执行maven package

maven clean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlvDCJ1h-1647763663020)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019002034218.png)]

maven package

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FnTeySek-1647763663021)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019002146234.png)]

将jar包上传至某个服务器上,这里以Linux虚拟为例

启动服务:java -jar jar包名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulqJAE5Z-1647763663021)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019002415709.png)]

再次访问即可:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgLj2HlN-1647763663022)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211019002525763.png)]

Springboot+Dubbo

安装zookeeper

安装本地Zookeeper注册中心,下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/

下载完成后解压,然后打开配置拷贝一份zoo_sample.cfg,修改名称为zoo.cfg

#zookeeper-3.4.14\conf\zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:/dev/zookeeper-3.4.14/data
clientPort=2181

启动zookeeper

#d@DESKTOP-ONHVHR8 MINGW64 /d/dev/zookeeper-3.4.14/bin
$ ./zkServer.sh  start
ZooKeeper JMX enabled by default
Using config: /d/dev/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#windows下启动zkServer.cmd

提供者:Provider

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHhIma5L-1647763663023)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108220455203.png)]

启动基本springboot项目

package com.example.privider.service;
public interface ProviderService {
    String sayHello2Consumer(String s);
}
package com.example.privider.serviceImpl;
import com.example.privider.service.ProviderService;
public class ProvideServiceImpl implements ProviderService {
    @Override
    public String sayHello2Consumer(String s) {
        System.out.println("provider s : " + s);
        return s;
    }
}
package com.example.privider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-un3jLjEI-1647763663023)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108223319162.png)]

Provide整合Dubbo

Dubbo有多种配置方式,在这只提两种:一种是注解,一种是xml文件配置

注解方式:在实现serviceImpl类上加的Service注解为Dubbo的注解,不能使用SpringBoot中的注解,并要设置服务名称;然后在消费端引入使用Interface注解,注明服务来源和服务名称,此外也需要在SpringBoot的配置文件中进行配置
参考网址:https://www.cnblogs.com/stars-one/p/12534295.html

XML文件方式:在资源包下新建xml文件,配置Dubbo的相关信息和服务,在消费端配置差异不大
参考网址:https://segmentfault.com/a/1190000019896723

在这推荐使用XML文件方式整合Dubbo,一是方便、快捷,不用多出配置;二是便于管理服务信息,查找修改都在一个文件。

而且大型项目一般都采用XML文件的方式,因此也比较实用,这里就只采用XML文件这种方式进行整合了

1、首先在pom中引入相关配置
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.6</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.10</version>
</dependency>
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.5</version>
</dependency>
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.32.Final</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.8.0</version>
</dependency>
2**、resource下新建Dubbo配置文件**

provider.xml(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!--当前项目在整个分布式架构里面的唯一名称,计算依赖关系的标签-->
    <dubbo:application name="provider" owner="ms"/>
    <dubbo:monitor protocol="registry"/>
    <!--dubbo这个服务所要暴露的服务地址所对应的注册中心-->
    <dubbo:registry address="N/A" />
    <!--当前服务发布所依赖的协议;webserovice、Thrift、Hessain、http-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--服务发布的配置,需要暴露的服务接口-->
    <dubbo:service
            interface="com.example.provider.service.ProviderService"
            ref="providerService"/>
    <!--Bean bean定义-->
    <bean id="providerService" class="com.example.provider.serviceImpl.ProvideServiceImpl"/>
</beans>

关于配置文件里的信息:

1上面的文件其实就是类似 spring 的配置文件,而且,dubbo 底层就是 spring。
2 节点:dubbo:application
就是整个项目在分布式架构中的唯一名称,可以在 name 属性中配置,另外还可以配置 owner 字段,表示属于谁。
3 节点:dubbo:monitor
监控中心配置, 用于配置连接监控中心相关信息,可以不配置,不是必须的参数。
4 节点:dubbo:registry
配置注册中心的信息,比如,这里我们可以配置 zookeeper 作为我们的注册中心。address 是注册中心的地址,这里我们配置的是 N/A 表示由 dubbo 自动分配地址。或者说是一种直连的方式,不通过注册中心。
5 节点:dubbo:protocol
服务发布的时候 dubbo 依赖什么协议,可以配置 dubbo、webserovice、Thrift、Hessain、http等协议。
6 节点:dubbo:service
这个节点就是我们的重点了,当我们服务发布的时候,我们就是通过这个配置将我们的服务发布出去的。interface 是接口的包路径,ref 是第7点配置的接口的 bean。
7 最后,我们需要像配置 spring 的接口一样,配置接口的 bean。

在启动类加上注解,SpringBoot在启动时,自动加载路径下的配置文件,整合Dubbo

@ImportResource(value = "provider.xml")
3、日志jar包冲突解决

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMpfSHKZ-1647763663024)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108225712877.png)]

用IDEA自带的工具去解决

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npVmdbSr-1647763663025)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108230047693.png)]

正常展示是这样,可以看出zkClient与zookeeper中的log4j冲突, 右键,将其排除,再次启动发现还有冲突为slf4j与logback的jar冲突,再用此方法排除掉slf4j的jar包就能正常运行了

4、 最终pom文件为:
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider</name>
    <description>provider</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.5</version>
            <exclusions>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.32.Final</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
5、运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOXdVjkB-1647763663025)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108231147436.png)]

服务已经暴露出去了:注意日志中的host,应该就是你本机的IP,在配置consumer的时候要用到

[DUBBO] Export dubbo service com.example.provider.service.ProviderService to url dubbo://192.168.116.1:20880/com.example.provider.service.ProviderService?anyhost=true&application=provider&bean.name=com.example.provider.service.ProviderService&bind.ip=192.168.116.1&bind.port=20880&dubbo=2.0.2&generic=false&interface=com.example.provider.service.ProviderService&methods=sayHello2Consumer&owner=ms&pid=4444&side=provider&timestamp=1636384126223, dubbo version: 2.6.6, current host: 192.168.116.1

解读:

1: 首先,在形式上我们发现,其实 dubbo 也是用类似于 http 的协议发布自己的服务的,只是这里我们用的是 dubbo 协议。
2:dubbo://192.168.116.1:20880/com.example.provider.service.ProviderService    上面这段链接就是 ? 之前的链接,构成:协议://ip:端口/接口
3:
anyhost=true&application=provider&bean.name=com.example.provider.service.ProviderService&bind.ip=192.168.116.1&bind.port=20880&dubbo=2.0.2&generic=false&interface=com.example.provider.service.ProviderService&methods=sayHello2Consumer&owner=ms&pid=4444&side=provider&timestamp=1636384126223, dubbo version: 2.6.6, current host: 192.168.116.1
?之后的字符串,分析后你发现,这些都是刚刚在 provider.xml 中配置的字段,然后通过 & 拼接而成的

消费者:consumer

搭建基础设施,引入提供方

先在pom文件中引入provider包,和web启动项,才可以进行基本代码编写,不然会找不到provider的service

<dependency>
    <groupId>com.example</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
package com.example.consumer.controller;
import com.example.provider.service.ProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
    @Autowired
    private ProviderService providerService;

    @GetMapping("/hello")
    public void sayHello() {
        String str = providerService.sayHello2Consumer("Not hello, just hi. ");
        System.out.println("consumer get str = " + str + " from provide");
    }
}
package com.example.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

此时项目是无法启动的,因为虽然引入了provider工程的包,但是consumer是找不到服务的,需要进行Dubbo配置来获取服务

consumer配置Dubbo

1、resource创建consumer.xml

创建方法同provider.xml,配置内容如下

同样这里也不使用zookeeper作为服务注册中心,仅仅使用自动配置方式, 注意dubbo:reference下url的IP是你的本机IP或者provider暴露服务的IP

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!--当前项目在整个分布式架构里面的唯一名称,计算依赖关系的标签-->
    <dubbo:application name="consumer" owner="ms"/>
    <!--dubbo这个服务所要暴露的服务地址所对应的注册中心-->
    <!--点对点的方式-->
    <dubbo:registry address="N/A"/>
    <!--<dubbo:registry address="zookeeper://localhost:2181" check="false"/>-->
    <!--生成一个远程服务的调用代理-->
    <!--点对点方式-->
    <dubbo:reference id="providerService"
                     interface="com.example.provider.service.ProviderService"
                     url="dubbo://192.168.116.1:20880/com.example.provider.service.ProviderService"/>
    <!--<dubbo:reference id="providerService"
                     interface="com.example.provider.service.ProviderService"/>-->
</beans>

2、在application.properties文件中修改Tomcat的启动默认端口号,因为Provide启动已经占用8080断开,再启动consumer默认也是8080端口,会冲突。

server.port=8081

3、在consumer的启动类上加注解,consumer启动时自动加载注解下的配置文件,整合Dubbo

@ImportResource("consumer.xml")

4、先启动Provider项目,再启动consumer项目,顺序错误会导致consumer找不到服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKqVH7Cr-1647763663026)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108233610793.png)]

[DUBBO] Successed connect to server /192.168.116.1:20880 from NettyClient 192.168.116.1 using dubbo version 2.6.6, channel is NettyChannel [channel=[id: 0x4e71c15e, L:/192.168.116.1:62981 - R:/192.168.116.1:20880]], dubbo version: 2.6.6, current host: 192.168.116.1

5、调一下接口,看控制台的输出情况,http://localhost:8081/hello(注意使用consumer的端口)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6MtiXKU-1647763663027)(C:\Users\d\AppData\Roaming\Typora\typora-user-images\image-20211108234153829.png)]

source(“consumer.xml”)


4、先启动Provider项目,再启动consumer项目,顺序错误会导致consumer找不到服务

[外链图片转存中...(img-TKqVH7Cr-1647763663026)]

```shell
[DUBBO] Successed connect to server /192.168.116.1:20880 from NettyClient 192.168.116.1 using dubbo version 2.6.6, channel is NettyChannel [channel=[id: 0x4e71c15e, L:/192.168.116.1:62981 - R:/192.168.116.1:20880]], dubbo version: 2.6.6, current host: 192.168.116.1

5、调一下接口,看控制台的输出情况,http://localhost:8081/hello(注意使用consumer的端口)

[外链图片转存中…(img-n6MtiXKU-1647763663027)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值