springCloud 小案例

先创建一个付工程父工程

2.打开pom,将父工程需要的依赖配置粘贴进去:

<parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.1.6.RELEASE</version>

    </parent>

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <java.version>1.8</java.version>

    </properties>

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-logging</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <version>1.18.4</version>

            <scope>provided</scope>

        </dependency>

    </dependencies>

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-dependencies</artifactId>

                <version>Greenwich.RELEASE</version>

                <type>pom</type>

                <scope>import</scope>

            </dependency>

        </dependencies>

    </dependencyManagement>

    <repositories>

        <repository>

            <id>spring-snapshots</id>

            <name>Spring Snapshots</name>

            <url>http://repo.spring.io/libs-snapshot-local</url>

            <snapshots>

                <enabled>true</enabled>

            </snapshots>

        </repository>

        <repository>

            <id>spring-milestones</id>

            <name>Spring Milestones</name>

            <url>http://repo.spring.io/libs-milestone-local</url>

            <snapshots>

                <enabled>false</enabled>

            </snapshots>

        </repository>

        <repository>

            <id>spring-releases</id>

            <name>Spring Releases</name>

            <url>http://repo.spring.io/libs-release-local</url>

            <snapshots>

                <enabled>false</enabled>

            </snapshots>

        </repository>

    </repositories>

    <pluginRepositories>

        <pluginRepository>

            <id>spring-snapshots</id>

            <name>Spring Snapshots</name>

            <url>http://repo.spring.io/libs-snapshot-local</url>

            <snapshots>

                <enabled>true</enabled>

            </snapshots>

        </pluginRepository>

        <pluginRepository>

            <id>spring-milestones</id>

            <name>Spring Milestones</name>

            <url>http://repo.spring.io/libs-milestone-local</url>

            <snapshots>

                <enabled>false</enabled>

            </snapshots>

        </pluginRepository>

    </pluginRepositories>

    <build>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

        </plugins>

    </build>

3.创建父工程的子模块,其中父工程的src可删除


删除父工程的src模块

创建子模块:new module


1


向外暴露的产品服务模块

新建的子模块也需要引入需要的依赖,父pom已经引入一部分。子模块只需要引入需要的pom,如下依赖:

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.32</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

数据库建表:mysql  / mybatis/jpa都行。mysql相关命令:SHOW FULL COLUMNS FROM + 表名(显示所有字段信息)

https://www.cnblogs.com/kumata/p/9125564.html

这里注意:当创建表时如果指定了表的编码为utf-8后,还不支持中文(显示为???)


显示中文异常

通过

show variables like '%char%'

可以查看

和编码  "character" , 有关的变量

使用set + variable_name = utf8;来修改编码


将不是utf8的都修改为utf8

再次查询显示正常:

正常显示中文

注意:此案例使用的springboot -jpa框架


配置文件

启动即可跑成功,按照同样的方式将第二个模块建立起来,order_service,


修改端口号和服务名,在controller中调用product服务模块的接口


注意此时需要通过RestTemplate对象来调用

避免踩坑:1.两个模块启动类都需要启动起来 2.端口号不能相同 3.在启动类中使用@Bean注入RestTemplate的Bean


调用product的controller

自己搭建的服务缺点有:如下,链路追踪记录日志用。


1.先解决微服务硬编码,路径(使用注册中心):Eureka


eureka


eureka主要作用


常见的注册中心:zookeeper(dubbo使用文件系统+监听通知机制),

eureka:java语言开发,基于restful api组件开发(广泛应用于spring cloud)

Consul:基于go语言开发,采用raft算法保证一致性,且支持健康检查

Nacos:基于阿里开发


注册中心特点

Eureka:


可能出现短暂的数据不一致d

往demo案例中新增注册中心:

使用eureka的步骤:

1.搭建eureka server

1.1创建工程

在刚才的demo中继续创建module   eureka_server

1.2 导入坐标

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

</dependency>

1.3 配置application.yml


1.4 配置启动类:与平时的不一样的是要用注解激活eureka


启动成功后访问:localhost:9000,即可进入eureka server提供的管理控制后台


2.将服务提供者注册到eurekaServer上

2.1 引入eureka client的坐标


2.2 修改yml配置文件,添加eureka Server 配置信息


2.3 修改启动类,添加服务发现的支持

可使用@EnableEurekaClient,@EnableDiscoveryClient中的一个,新版springboot也可以不写这两个注解也能生效


重新启动启动类,再次访问localhost:9000(eureka server)


图中的application为注册到注册中心的服务,右侧是地址,服务名和端口号

3.服务消费者通过注册中心获取服务列表,并调用:

eureka中的元数据:服务的主机名,ip等信息,可以通过eureka server进行获取,用于服务之间的调用

3.1 补充pom

3.2 yml补充eureka相应配置

3.3 启动类服务发现(激活注解可写可不写)

3.4 在ciontroller中注入DiscoveryClient,使用其getInstances获取元数据


获取元数据,并将硬编码转换为从元数据获取url并拼接

再次启动order_service的启动类:访问


以上案例如果出现eureka Server宕机的情况,就不满足cap的可用性了。所以需要eureka Server 高可用性集群


多个eureka server互相注册

eureka Server的高可用:

1.准备两个eureka Server(相互注册)

eureka1:9000

eureka2:8000

模拟两个eureka server:

修改run窗口为run dashboard在Help---Edit Custom VM Options中添加了 -Dide.run.dashboard = true 键值对;并重新启动IntelliJ IDEA!

此步是为了模拟两个eureka server启动

先启动9000的,其yml配置如图:


9000 端口yml

2.需要将微服务注册到两个eureka server上中,所以在建立一个eureka server模块,配置跟原来的一样,除了yml文件的端口号变一下:

eurek server2的配置

配置完成后重启:

访问两个后台都是如下图:


eureka server 互相注册成功

上图还有一点:Application显示UNKNOW,此时需要继续配置yml


配置application的名称


配置了application name之后

3.因为两个eureka server互相注册之后会信息同步,所以服务提供者进行注册的时候,不需要注册多个,注册一个eureka server就行啦,因为在上面已经配置了注册9000端口eureka server,直接启动服务验证。



如图可见,数据同步,8000端口的也有了

高可用eureka server集群可能需要的server更多,不止两个,但是每个eureka server之间都需要相互注册,注册多个eureka server地址用逗号隔开:

多个server注册写法

当然服务消费者也需要配置多个地址:


以上为配置高可用eureka server集群,配置以后可以试着尝试断开一个eureka server,验证结果是无影响。

细节问题:

1.在eureka控制台显示ip,现在显示的还不够清晰:


使用instance-id配置要显示的ip

重启后查看:


2.Eureka Server的剔除问题

默认机制

可在服务提供者端设置心跳间隔,设置续约到期时间:单位是s,如图配置后,重启,再断开服务,等几秒即可发现后台控制台已经剔除此服务提供者:可以试试



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。