学习Spring Cloud第三课(服务提供者和服务消费者)

来源:互联网 发布:淘宝怎么上架宝贝教程 编辑:程序博客网 时间:2024/06/07 23:34

一、概念

       什么是服务提供者和服务消费者?

       服务提供者:是指服务的被调用方(即:为其它服务提供服务的服务)

       服务消费者:是指服务的调用方(即:依赖其它服务的服务)

二、编写服务提供者

       首先,我们需要访问http://start.spring.io,如下图所示

       接着,选择Spring Boot的版本,目前最新的Spring Boot版本是1.5.1,如下图所示。

       接着,在Group和Artifact两栏分别输入如下图所示内容。

        接着我们需要选择一些依赖,在搜索框中输入“Web”,会自动显示出有关Web的下拉列表,我们选择第一个,如下图所示。

       选择完Web之后,会在下方看到我们所依赖的Web,如下图所示

        接着,再选择JPA、MySQL,最后点击下方的“Generate Project”按钮,如下图所示。

        点击上图的"Generrate Project"之后弹出如下图所示的对话框,我们点击另存为保存到本地。

       接着,我们打开开发工具IntellijIDEA工具,如果是第一次使用IDEA工具,会出现如下图所示的界面,我们点击“Import Project”。

       会弹出如下图所示的界面,我们选择我们刚才生成的microservice-simple-provider-user工程下的pom.xml文件,然后点击"OK"

       点击上图的“OK”之后,我们便可以看到如下图所示的界面,我们什么也不做,直接点击"Next"

       点击上图的"Next"之后,我们会看到如下图所示的界面,我们还是直接点击"Next"

        点击上图的"Next"之后,我们可以看到下面的界面,我们前面说过了,我们开发微服务使用jdk1.8,因此这里要选择jdk1.8,然后点击"Next"

        点击上图的"Next"之后,我们可以看到如下图所示的界面,我们直接点击"Finish"

      点击“Finish”之后,加载Maven依赖,会出现如下图所示的界面。

       上图中resources目录下的static和templates两个文件夹没有什么用,我们删掉它,然后我们在resources目录下新建一个schema.sql文件,新建的schema.sql文件需要配置一下“Configure data source”、"Change dialect to..."这两项,我们先点击"Configure data source"。

          点击上图的"Configure data source"之后,我们可以看到如下图所示的界面,我们选择左侧的"MySQL",右侧的"Driver files"下面没有内容,我们点击"Download"下载驱动文件。

       下载完驱动文件后,如下图所示,我们点击"OK"

        这时如果您的IDEA工具还从来没添加过Mysql,那么schema.sql文件依然提示要配置data source和方言,那么我们怎么添加Mysql呢?我们发现啊,在IDEA工具的右侧,有一列工具栏,我们点击Database那一栏。


        点击上图的"Database"那一栏后我们可以看到如下图所示的界面,可以看到,我还未添加过任何数据库,下面我们点击那个"+"号图标。


     点击上图的"+"号图标之后,我们看到如下图所示界面,我们点击MySQL


        点击上图的"MySQL"之后,我们可以看到如下图所示的界面,我们新建一个数据库Database:"microservice",User和Password是我们本地安装的Mysql的用户名和密码。之后我们需要测试连接是否可以成功(先不要点击Test Connection)。


       在测试连接之前,我们需要先新建一个与我们上图输入的database名字一样的数据库"microservice",如下图所示。


       现在我们可以测试刚才的连接是否可以成功,我们点击那个"Test Connection",如果成功,将如下图所示,我们点击"OK"


      下面我们点击"Apply"、"OK",如下图所示


       点击上图的"Apply"和"OK"之后,可以看到如下图所示的界面,我们可以试一条SQL语句看是否可以查询到结果,比如我们查询所有的数据库,可以看到正确查询出了结果。


        我们添加完Mysql数据库后,我们刚才添加的schema.sql文件提示的内容便减少了一条,只剩下让我们配置方言了,如下图所示。我们点击"Change dialect to..."


        我们可以看到如下图所示的界面,可以看到默认情况下SQL Dialect都是Generic,我们既然用的数据库是Mysql,那么我们便点击"Generic",在下拉框中选择"MySQL"。


       选择完方言之后,如下图所示。我们点击"OK"


     点击上图的"OK"之后,我们可以看到我们的schema.sql文件终于不再报异常提示信息了,我们在该sql文件中写上建表语句,如下图所示。


        同理,我们再新建一个data.sql文件,并在该文件中写上插入语句,如下图所示。


      下面我们新建一个实体类User,目录结构如下图所示(Intellijidea生成get、set方法的快捷键是Alt+insert),需要注意的是,由于我们这里用的是Mysql,因此@GeneratedValue策略要使用Mysql的主键生成策略,不同的数据库主键生成策略不同。


        接着我们创建一个接口类UserRepository(也就是我们所熟悉的Dao),如下图所示,之所以让UserRepository继承JpaRepository是为了直接使用JpaRepository的接口方法,而不必自己再写接口了。


     下面我们再写个Controller,名字就叫UserController,如下图所示。


      下面我们把resources目录下的application.properties文件的后缀名改为.yml,因为.yml文件有强大的提示功能并且格式固定且简洁,特别适合编辑配置内容。如下图所示


     application.yml文件中配置的内容如下,下面说下配置的意思,首先port:7900的意思是访问端口,generate-ddl: false表示sping启动的时候不自动生成增删改查接口(因为我们自己会写增删改查接口),show-sql: true表示会在控制台输出sql语句,hibernate.ddl-auto: none的意思是hibernate加载的时候也不自动生成增删改查接口。datasource.platform: mysql表示使用的数据库是mysql,(注意:datasource.url、datasource.username、datasource.password、datasource.driver-class-name这四项配置是在非H2数据库的情况下必须配置的,我们使用的是mysql,因此配置的也是mysql数据库的信息,如果使用的是别的数据库相应的做调整就可以了。另外,由于查询数据库可能会出现乱码情况,因此我们在驱动jdbc:mysql://localhost:3306/microservice后面加上了"?useUnicode=true&characterEncoding=utf-8"这句编码配置)datasource.schema: classpath:schema.sql表示指定建表的sql文件,datasource.data: classpath:data.sql表示指定插入数据的sql文件。logging下面配置的是日志的输出级别,其中关于sql的那两个配置跟show-sql: true是基本一样的。

server:  port: 7900spring:  jpa:    generate-ddl: false    show-sql: true    hibernate:      ddl-auto: none  datasource:    platform: mysql    url: jdbc:mysql://localhost:3306/microservice?useUnicode=true&characterEncoding=utf-8    username: root    password: root    driver-class-name: com.mysql.jdbc.Driver    schema: classpath:schema.sql    data: classpath:data.sqllogging:  level:    root: INFO    org.hibernate: INFO    org.hibernate.type.descriptor.sql.BasicBinder: TRACE    org.hibernate.type.descriptor.sql.BasicExtractor: TRACE    com.itmuch: DEBUG

     在spring boot中有一种规定,那就是启动类必须与controller、entity、repository在同一级!否则会有问题!


          做完上述的操作之后,我们来启动这个微服务,我们就在这个启动类页面右键,在右键菜单中点击"Run MicroserviceSimplePr..."即可进行启动。


       当看到如下图所示的启动信息,表示启动成功。


        启动成功,我们来测试一下我们刚才写的findById接口是否好用,我们在浏览器地址栏中输入:http://localhost:7900/simple/1可以看到如下图所示的界面,说明我们的服务提供者部署成功了!!!


三、服务消费者

       第二步我们搭建了一个服务提供者,现在我们来搭建一个服务消费者,我们依然从http://start.spring.io网站生成我们的微服务框架,我们可以注意到,在Dependencies这一栏只选择了一个Web,选好并输入完后,点击"Generate Project"按钮。

      点击上图的"Generate Project"按钮后会弹出下载对话框,如下图所示,另存为保存到本地磁盘。

       下载后,我们解压到当前文件夹,如下图所示。

      下面我们把该消费者导入到Intellij IDEA工具中,我们点击File---->New------>Module from Existing Sources...,如下图所示

      在弹出的对话框中我们选择我们刚才加压好的movie微服务的pom.xml文件,然后点击"OK",如下图所示。

     下面两步只需点击"Next",然后点击"Finish"按钮即可把工程加到Intellij IDEA工具中来,如下图所示

        下面我们在movie微服务下也新建一个User类,如下图所示,可以看到这里我们并没有为User类添加注解,这是因为这里我们只是把它当成了一个普通的vo类而已,而第一个微服务之所以添加Jpa注解是因为我们要把 那个User类当做跟数据库表一一对应的实体类,主键生成策略等都要配置。

       下面我们来新建一个Controller类,如下图所示,我们在该类的findById方法 中调用访问第一个微服务接口的地址,然后返回一个User对象。也就是说movie的api消费了user服务的api。

      下面我们来修改一下配置文件,将application.properties的后缀名改为.yml,并在配置文件中加入端口的配置,如下图所示。

 

      这样,一个简单的服务消费者代码就写完了,下面我们来依次启动服务提供者和服务消费者,我们都需要到服务启动类页面进行启动(下图是movie服务的启动)

      我们启动movie微服务的时候会报一个错,如下描述:

Description:
Field restTemplate in com.itmuch.cloud.controller.MovieController required a bean of type 'org.springframework.web.client.RestTemplate' that could not be found.

Action:
Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.

      这是因为没有找到RestTemplate的实例,因此为了解决该问题,我们在movie的启动类中添加RestTemplate的Bean注解,如下图所示

       这时我们再重新启动movie微服务,便可以正常启动了,如下图所示

      两个微服务都启动完之后,我们去访问movie微服务的controller接口,看是否能得到User对象的信息,我们输入的访问地址是:http://localhost:7901/movie/1,如下图所示,可以看到,能正常得到User的信息,说明我们的服务消费者能消费服务提供者提供的服务。

      至此,两个最简单的微服务我们就搭建完了,但是现在这两个微服务还存在很大的问题,比如我们在服务消费者当中硬编码访问路径了,这在传统框架的前提下问题不大(因为环境比较固定),但是对微服务而说,IP、端口是动态的,这样我们就不能硬编码了。即使把访问路径放到配置文件依然会带来很大的工作量(因为可能会发生连环依赖的情况,一个微服务改了,可能其它的微服务都需要改变)。大家可能会提出使用nginx来进行负载管理,当微服务的数量非常庞大时,用nginx进行负载均衡也是一件困难的事情。

0 0
原创粉丝点击