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可删除
创建子模块:new module
新建的子模块也需要引入需要的依赖,父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;来修改编码
再次查询显示正常:
注意:此案例使用的springboot -jpa框架
启动即可跑成功,按照同样的方式将第二个模块建立起来,order_service,
避免踩坑:1.两个模块启动类都需要启动起来 2.端口号不能相同 3.在启动类中使用@Bean注入RestTemplate的Bean
自己搭建的服务缺点有:如下,链路追踪记录日志用。
1.先解决微服务硬编码,路径(使用注册中心):Eureka
常见的注册中心:zookeeper(dubbo使用文件系统+监听通知机制),
eureka:java语言开发,基于restful api组件开发(广泛应用于spring cloud)
Consul:基于go语言开发,采用raft算法保证一致性,且支持健康检查
Nacos:基于阿里开发
Eureka:
往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)
3.服务消费者通过注册中心获取服务列表,并调用:
eureka中的元数据:服务的主机名,ip等信息,可以通过eureka server进行获取,用于服务之间的调用
3.1 补充pom
3.2 yml补充eureka相应配置
3.3 启动类服务发现(激活注解可写可不写)
3.4 在ciontroller中注入DiscoveryClient,使用其getInstances获取元数据
再次启动order_service的启动类:访问
以上案例如果出现eureka Server宕机的情况,就不满足cap的可用性了。所以需要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!
先启动9000的,其yml配置如图:
2.需要将微服务注册到两个eureka server上中,所以在建立一个eureka server模块,配置跟原来的一样,除了yml文件的端口号变一下:
配置完成后重启:
访问两个后台都是如下图:
上图还有一点:Application显示UNKNOW,此时需要继续配置yml
3.因为两个eureka server互相注册之后会信息同步,所以服务提供者进行注册的时候,不需要注册多个,注册一个eureka server就行啦,因为在上面已经配置了注册9000端口eureka server,直接启动服务验证。
高可用eureka server集群可能需要的server更多,不止两个,但是每个eureka server之间都需要相互注册,注册多个eureka server地址用逗号隔开:
当然服务消费者也需要配置多个地址:
以上为配置高可用eureka server集群,配置以后可以试着尝试断开一个eureka server,验证结果是无影响。
细节问题:
1.在eureka控制台显示ip,现在显示的还不够清晰:
重启后查看:
2.Eureka Server的剔除问题
可在服务提供者端设置心跳间隔,设置续约到期时间:单位是s,如图配置后,重启,再断开服务,等几秒即可发现后台控制台已经剔除此服务提供者:可以试试