Mastering Microservices With Java 9

2y ago
20 Views
2 Downloads
6.38 MB
372 Pages
Last View : 1m ago
Last Download : 3m ago
Upload by : Helen France
Transcription

Mastering Microservices with Java 9

Second EditionBuild domain-driven microservice-based applications with Spring, Spring Cloud, andAngularSourabh Sharma

BIRMINGHAM - MUMBAI

Mastering Microservices with Java 9

Second EditionCopyright 2017 Packt PublishingAll rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmittedin any form or by any means, without the prior written permission of the publisher, except in the case ofbrief quotations embedded in critical articles or reviews.Every effort has been made in the preparation of this book to ensure the accuracy of the informationpresented. However, the information contained in this book is sold without warranty, either express orimplied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable forany damages caused or alleged to be caused directly or indirectly by this book.Packt Publishing has endeavored to provide trademark information about all of the companies andproducts mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannotguarantee the accuracy of this information.First published: June 2016Second edition: December 2017Production reference: 1051217Published by Packt Publishing Ltd.Livery Place35 Livery StreetBirminghamB3 2PB, UK.ISBN 978-1-78728-144-8www.packtpub.com

CreditsAuthorCopy EditorSafis EditingSourabh SharmaReviewerProject CoordinatorGuido GrazioliVaidehi SawantCommissioning EditorProofreaderAaron LazarSafis EditingAcquisition EditorIndexerDenim PintoAishwarya GangawaneContent Development EditorProduction CoordinatorZeeyan PinheiroMelwyn D'saTechnical EditorRomy Dias

About the AuthorSourabh Sharma has over 15 years of experience in product/application development. His expertiselies in designing, developing, deploying, and testing N-tier web applications and leading teams. Heloves to troubleshoot complex problems and look for the best solutions.Throughout his career, he has successfully delivered various on-premise and cloudapplications/products to some of the fortune 500 companies that has amazed stakeholders, includinghappy satisfied customers.Sourabh believes in the continuous process of learning and has been continuously updating his skill set—from standalone application development to microservices development, from JDK 1.2 to Java 9,from IE 5 dependent frontend code to cross-browser development, and from on-premise deployment tocloud deployment. He has effectively managed delivering single products to bouquets of applications.

About the ReviewerGuido Grazioli has worked as an application developer, software architect, and systems integrator for awide variety of business applications across several domains. He is a hybrid software engineer withdeep knowledge of the Java platform and tooling as well as Linux systems. He is particularly interestedin SOAs, EIPs, continuous integration and delivery, and service orchestration in the cloud.

www.PacktPub.comFor support files and downloads related to your book, please visit www.PacktPub.com. Did you know thatPackt offers eBook versions of every book published, with PDF and ePub files available? You canupgrade to the eBook version at www.PacktPub.com and as a print book customer, you are entitled to adiscount on the eBook copy. Get in touch with us at service@packtpub.com for more details.At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of freenewsletters and receive exclusive discounts and offers on Packt books and eBooks.https://www.packtpub.com/maptGet the most in-demand software skills with Mapt. Mapt gives you full access to all Packt books andvideo courses, as well as industry-leading tools to help you plan your personal development andadvance your career.

Why subscribe?Fully searchable across every book published by PacktCopy and paste, print, and bookmark contentOn demand and accessible via a web browser

Customer FeedbackThanks for purchasing this Packt book. At Packt, quality is at the heart of our editorial process. To helpus improve, please leave us an honest review on this book's Amazon page at https://www.amazon.com/dp/1787281442.If you'd like to join our team of regular reviewers, you can e-mail us at customerreviews@packtpub.com. Weaward our regular reviewers with free eBooks and videos in exchange for their valuable feedback. Helpus be relentless in improving our products!

Table of ContentsPrefaceWhat this book coversWhat you need for this bookWho this book is forConventionsReader feedbackCustomer supportDownloading the example codeErrataPiracyQuestions1.A Solution ApproachEvolution of microservicesMonolithic architecture overviewLimitation of monolithic architecture versus its solution with microservicesTraditional monolithic designMonolithic design with servicesServices designOne dimension scalabilityRelease rollback in case of failureProblems in adopting new technologiesAlignment with Agile practicesEase of development – could be done betterMicroservices build pipelineDeployment using a container such as DockerContainersDockerDocker's architectureDeploymentSummary2.Setting Up the Development EnvironmentNetBeans IDE installation and setupSpring Boot configurationSpring Boot overviewAdding Spring Boot to our main projectSample REST programWriting the REST controller classThe @RestController annotationThe @RequestMapping annotationThe @RequestParam annotationThe @PathVariable annotationMaking a sample REST application executableAdding a Jetty-embedded serverSetting up the application buildRunning the Maven toolExecuting with the Java command

REST API testing using the Postman Chrome extensionSome more positive test scenariosNegative test scenariosSummary3.Domain-Driven DesignDomain-driven design fundamentalsFundamentals of DDDUbiquitous languageMultilayered architecturePresentation layerApplication layerDomain layerInfrastructure layerArtifacts of domain-driven designEntitiesValue lesStrategic design and principlesBounded contextContinuous integrationContext mapShared kernelCustomer-supplierConformistAnticorruption layerSeparate waysOpen Host ServiceDistillationSample domain serviceEntity implementationRepository implementationService implementationSummary4.Implementing a MicroserviceOTRS overviewDeveloping and implementing microservicesRestaurant microserviceOTRS implementationController classAPI versioningService classesRepository classesEntity classesRegistration and discovery service (Eureka service)Eureka client

Booking and user ent and TestingMandatory services for good microservicesService discovery and registrationEdge serversLoad balancingCircuit breakersMonitoringAn overview of microservice architecture using Netflix OSSLoad balancingServer-side load balancingClient-side load balancingCircuit breakers and monitoringUsing Hystrix's fallback methodsMonitoringSetting up the Hystrix dashboardCreating Turbine servicesBuilding and running the OTRS applicationMicroservice deployment using containersInstallation and configurationDocker machine with 4 GBBuilding Docker images with MavenRunning Docker using MavenIntegration testing with DockerPushing the image to a registryManaging Docker containersReferencesSummary6.Reactive MicroservicesAn overview of the reactive microservice architectureResponsiveResilientElasticMessage drivenImplementing reactive microservicesProducing an eventConsuming the eventReferencesSummary7.Securing MicroservicesEnabling Secure Socket LayerAuthentication and authorizationOAuth 2.0Usage of OAuthOAuth 2.0 specification - concise details

OAuth 2.0 rolesResource ownerResource serverClientAuthorization serverOAuth 2.0 client registrationClient typesClient profilesClient identifierClient authenticationOAuth 2.0 protocol endpointsAuthorization endpointToken endpointRedirection endpointOAuth 2.0 grant typesAuthorization code grantImplicit grantResource owner password credentials grantClient credentials grantOAuth implementation using Spring SecurityAuthorization code grantImplicit grantResource owner password credential grantClient credentials grantReferencesSummary8.Consuming Services Using a Microservice Web ApplicationAngularJS framework overviewMVCMVVMModulesProviders and rDevelopment of OTRS featuresHome page/restaurant list Search restaurantsRestaurant details with reservation optionrestaurant.htmlLogin pagelogin.htmllogin.js

Reservation confirmationSetting up the web applicationReferencesSummary9.Best Practices and Common PrinciplesOverview and mindsetBest practices and principlesNanoservice, size, and monolithicContinuous integration and deploymentSystem/end-to-end test automationSelf-monitoring and loggingA separate data store for each microserviceTransaction boundariesMicroservices frameworks and toolsNetflix Open Source Software (OSS)Build - NebulaDeployment and delivery - Spinnaker with AminatorService registration and discovery - EurekaService communication - RibbonCircuit breaker - HystrixEdge (proxy) server - ZuulOperational monitoring - AtlasReliability monitoring service - Simian ArmyAWS resource monitoring - EddaOn-host performance monitoring - VectorDistributed configuration management - ArchaiusScheduler for Apache Mesos - FenzoCost and cloud utilization - IceOther security tools - Scumblr and FIDOScumblrFully Integrated Defence Operation (FIDO)ReferencesSummary10.Troubleshooting GuideLogging and the ELK stackA brief overviewElasticsearchLogstashKibanaELK stack setupInstalling ElasticsearchInstalling LogstashInstalling KibanaRunning the ELK stack using Docker ComposePushing logs to the ELK stackTips for ELK stack implementationUse of correlation ID for service callsLet's see how we can tackle this problemUse of Zipkin and Sleuth for tracking

Dependencies and versionsCyclic dependencies and their impactAnalyzing dependencies while designing the systemMaintaining different versionsLet's explore moreReferencesSummary11.Migrating a Monolithic Application to Microservice-Based ApplicationDo you need to migrate?Cloud versus on-premise versus both cloud and on-premiseCloud only solutionOn-premise only solutionBoth cloud and on-premise solutionApproaches and keys to successful migrationIncremental migrationProcess automation and tools setupPilot projectStandalone user interface applicationsMigrating modules to microservicesHow to accommodate a new functionality during migrationReferencesSummary

PrefaceMicroservices are the next big thing in designing scalable, easy-to-maintain applications. They not onlymakes application development easier, but also offer great flexibility to utilize various resourcesoptimally. If you want to build an enterprise-ready implementation of a microservice architecture, thenthis is the book for you!Starting off by understanding the core concepts and framework, you will then focus on the high-leveldesign of large software projects. You will gradually move on to setting up the developmentenvironment and configuring it before implementing continuous integration to deploy your microservicearchitecture. Using Spring Security, you will secure microservices and test them effectively using RESTJava clients and other tools such as RxJava 2.0. We'll show you the best patterns, practices, andcommon principles of microservice design, and you'll learn to troubleshoot and debug the issues facedduring development. We'll show you how to design and implement reactive microservices. Finally, we'llshow you how to migrate a monolithic application to a microservice-based application.By the end of the book, you will know how to build smaller, lighter, and faster services that can beimplemented easily in a production environment.

What this book covers, A Solution Approach, covers the high-level design of large software projects and helps youunderstand the common problems faced in a production environment and the solutions to theseproblems.Chapter 1, Setting up the Development Environment, shows how to set up the development environmentand configure Spring Boot effectively. You will also learn how to build a sample REST service.Chapter 2, Domain-Driven Design, teaches you the fundamentals of domain-driven design and how is itused practically by design sample services.Chapter 3, Implementing Microservices, shows you how to code the service and then write the unit testfor the developed code.Chapter 4, Deployment and Testing, covers how to deploy microservices and develop them on Docker.You will also learn to write the Java test client for microservices.Chapter 5, Reactive Microservices, shows how to design and implement reactive microservices.Chapter 6, Securing Microservices, covers the different security methods and the different ways toimplement OAuth. You will also understand Spring Security implementation.Chapter 7, Consuming Microservices Using Web Application, explains how to develop a web application(UI) using the Knockout. You will require Bootstrap JS libraries to build a prototype of a webapplication that will consume microservices to show data and flow of sample project—a small utilityproject.Chapter 8, Best Practices and Common Principles, talks about microservice design principles. You willlearn an effective way of developing microservices and how Netflix has implemented microservices.Chapter 9, Troubleshooting Guide, explains the common problems encountered during the developmentof microservices and their solutions. This will help you follow the book smoothly and would makelearning swift.Chapter 10, Migrating a Monolithic Application to a Microservice-Based Application, shows you how tomigrate a monolithic application to a microservice-based application.Chapter 11

What you need for this bookFor this book, you can use any operating system (Linux, Windows, or Mac) with a minimum of 2 GBRAM. You will also require NetBeans with Java, Maven, Spring Boot, Spring Cloud, Eureka Server,Docker, and a CI/CD application. For Docker containers, you may need a separate VM or a cloud hostwith preferably 16 GB or more of RAM.

Who this book is forThis book is for Java developers who are familiar with microservice architectures and now wants totake a deeper dive into effectively implementing microservices at an enterprise level. A reasonableknowledge of core microservice elements and applications is expected.

ConventionsIn this book, you will find a number of text styles that distinguish between different kinds ofinformation. Here are some examples of these styles and an explanation of their meaning.Code words in text, database table names, folder names, filenames, file extensions, pathnames, dummyURLs, user input, and Twitter handles are shown as follows: "The produceBookingOrderEvent method isadded, which takes the booking object."A block of code is set as follows:angular.module('otrsApp.restaurants', e'])Any command-line input or output is written as follows:npm install --no-optional gulpNew terms and important words are shown in bold. Words that you see on the screen, for example, inmenus or dialog boxes, appear in the text like this: "On the Tools dialog, select Create package.json,Create bower.json, and Create gulpfile.js."Tips and important notes appear in a box like this.Tips and tricks appear like this.

Reader feedbackFeedback from our readers is always welcome. Let us know what you think about this book--what youliked or disliked. Reader feedback is important to us as it helps us develop titles that you will really getthe most out of. To send us general feedback, simply email feedback@packtpub.com, and mention the book'stitle in the subject of your message. If there is a topic that you have expertise in and you are interestedin either writing or contributing to a book, see our author guide at www.packtpub.com/authors.

Customer supportNow that you are the proud owner of a Packt book, we have a number of things to help you to get themost from your purchase.

Downloading the example codeYou can download the example code files for this book from your account at http://www.packtpub.com. Ifyou purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have thefiles e-mailed directly to you. You can download the code files by following these steps:1.2.3.4.5.6.7.Log in or register to our website using your e-mail address and password.Hover the mouse pointer on the SUPPORT tab at the top.Click on Code Downloads & Errata.Enter the name of the book in the Search box.Select the book for which you're looking to download the code filesChoose from the drop-down menu where you purchased this book from.Click on Code Download.Once the file is downloaded, please make sure that you unzip or extract the folder using the latestversion of:WinRAR / 7-Zip for WindowsZipeg / iZip / UnRarX for Mac7-Zip / PeaZip for LinuxThe code bundle for the book is also hosted on GitHub at services-with-Java-9-Second-Edition. We also have other code bundles from our rich catalog of books andvideos available at https://github.com/PacktPublishing/. Check them out!

ErrataAlthough we have taken every care to ensure the accuracy of our content, mistakes do happen. If youfind a mistake in one of our books-maybe a mistake in the text or the code--we would be grateful if youcould report this to us. By doing so, you can save other readers from frustration and help us improvesubsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub.com/submit-errata, selecting your book, clicking on the Errata Submission Form link, and entering thedetails of your errata. Once your errata are verified, your submission will be accepted and the errata willbe uploaded to our website or added to any list of existing errata under the Errata section of that title.To view the previously submitted errata, go to https://www.packtpub.com/books/content/support and enter thename of the book in the search field. The required information will appear under the Errata section.

PiracyPiracy of copyrighted material on the Internet is an ongoing problem across all media. At Packt, we takethe protection of our copyright and licenses very seriously. If you come across any illegal copies of ourworks in any form on the internet, please provide us with the location address or website nameimmediately so that we can pursue a remedy.Please contact us at copyright@packtpub.com with a link to the suspected pirated material.We appreciate your help in protecting our authors and our ability to bring you valuable content.

QuestionsIf you have a problem with any aspect of this book, you can contact us at questions@packtpub.com, and wewill do our best to address the problem.

A Solution ApproachAs a prerequisite, you should have a basic understanding of microservices and software architecturestyle. Having a basic understanding could help you to understand the concepts and this book thoroughly.After reading this book, you could implement microservices for on-premise or cloud productiondeployment and learn the complete life-cycle from design, development, testing, and deployment withcontinuous integration and deployment. This book is specifically written for practical use and to igniteyour mind as a solution architect. Your learning will help you to develop and ship products for any typeof premise, including SaaS, PaaS, and so on. We'll primarily use the Java and Java-based frameworktools such as Spring Boot and Jetty, and we will use Docker as a container.In this chapter, you will learn the eternal existence of microservices, and how it has evolved. Ithighlights the large problems that on-premise and cloud-based products face and how microservicesdeals with it. It also explains the common problems encountered during the development of SaaS,enterprise, or large applications and their solutions.In this chapter, we will learn the following topics:Microservices and a brief backgroundMonolithic architectureLimitation of monolithic architectureThe benefits and flexibility that microservices offerMicroservices deployment on containers such as Docker

Evolution of microservicesMartin Fowler explains:The term microservice was discussed at a workshop of software architects near Venice in May 2011 todescribe what the participants saw as a common architectural style that many of them had been recentlyexploring. In May 2012, the same group decided on µServices as the most appropriate name.Let's get some background on the way it has evolved over the years. Enterprise architecture evolvedmore from historic mainframe computing, through client-server architecture (two-tier to n-tier) toService-Oriented Architecture (SOA).The transformation from SOA to microservices is not a standard defined by an industry organization,but a practical approach practiced by many organizations. SOA eventually evolved to becomemicroservices.Adrian Cockcroft, a former Netflix Architect, describes it as:Fine grain SOA. So microservice is SOA with emphasis on small ephemeral components.Similarly, the following quote from Mike Gancarz, a member that designed the X Windows system,which defines one of the paramount precepts of Unix philosophy, suits the microservice paradigm aswell:Small is beautiful.Microservices shares many common characteristics with SOA, such as the focus on services and howone service decouples from another. SOA evolved around monolithic application integration byexposing API that was mostly Simple Object Access Protocol (SOAP) based. Therefore, middlewaresuch as Enterprise Service Bus (ESB) is very important for SOA. Microservices are less complex, andeven though they may use the message bus it is only used for message transport and it does not containany logic. It is simply based on smart endpoints.Tony Pujals defined microservices beautifully:In my mental model, I think of self-contained (as in containers) lightweight processes communicatingover HTTP, created and deployed with relatively small effort and ceremony, providing narrowly-focusedAPIs to their consumers.Though Tony only talks about the HTTP, event-driven microservices may use the different protocol forcommunication. You can make use of Kafka for implementing the event-driven microservices. Kafkauses the wire protocol, a binary protocol over TCP.

Monolithic architecture overviewMicroservices is not something new, it has been around for many years. For example, Stubby, a generalpurpose infrastructure based on Remote Procedure Call (RPC) was used in Google data centers in theearly 2000s to connect a number of service with and across data centers. Its recent rise is owing to itspopularity and visibility. Before microservices became popular, there was primarily monolithicarchitecture that was being used for developing on-premise and cloud applications.Monolithic architecture allows the development of different components such as presentation,application logic, business logic, and Data Access Objects (DAO), and then you either bundle themtogether in Enterprise Archive (EAR) or Web Archive (WAR), or store them in a single directoryhierarchy (for example, Rails, NodeJS, and so on).Many famous applications such as Netflix have been developed using microservices architecture.Moreover, eBay, Amazon, and Groupon have evolved from monolithic architecture to a microservicesarchitecture.Now that you have had an insight into the background and history of microservices, let's discuss thelimitations of a traditional approach, namely monolithic application development, and compare howmicroservices would address them.

Limitation of monolithic architecture versusits solution with microservicesAs we know, change is eternal. Humans always look for better solutions. This is how microservicesbecame what it is today and it may evolve further in the future. Today, organizations are using Agilemethodologies to develop applications--it is a fast-paced development environment and it is also on amuch larger scale after the invention of cloud and distributed technologies. Many argue that monolithicarchitecture could also serve a similar purpose and be aligned with Agile methodologies, butmicroservices still provides a better solution to many aspects of production-ready applications.To understand the design differences between monolithic and microservices, let's take an example of arestaurant table-booking application. This application may have many services such as customers,bookings, analytics and so on, as well as regular components such as presentation and database.We'll explore three different designs here; traditional monolithic design, monolithic design withservices, and microservices design.

Traditional monolithic designThe following diagram explains the traditional monolithic application design. This design was widelyused before SOA became popular:Traditional monolithic application designIn traditional monolithic design, everything is bundled in the same archive such as Presentation code,Application Logic and Business Logic code, and DAO and related code that interacts with thedatabase files or another source.

Monolithic design with servicesAfter SOA, applications started being developed based on services, where each component provides theservices to other components or external entities. The following diagram depicts the monolithicapplication with different services; here services are being used with a Presentation component. Allservices, the Presentation component, or any other components are bundled together:

Services designThe following third design depicts the microservices. Here, each component represents autonomy. Eachcomponent could be developed, built, tested, and deployed independently. Here, even the applicationUser Interface (UI) component could also be a client and consume the microservices. For the purposeof our example, the layer designed is used within µService.The API Gateway provides the interface where different clients can access the individual services andsolve the following problems:What do you do when you want to send different responses to different clients for the same service? Forexample, a booking service could send different responses to a mobile client (minimal information) anda desktop client (detailed information) providing different details, and something different again to athird-party client.A response may require fetching information from two or more services:After observing all the sample design diagrams, which are very high-level designs, you might find outthat in monolithic design, the components are bundled together and tightly coupled.All the services are part of the same bundle. Similarly, in the second design figure, you can see a variantof the first figure where all services could have their own layers and form different APIs, but, as shownin the figure, these are also all bundled together.

Conversely, in microservices, design components are not bundled together and have loose coupling.Each service has its own layers and DB, and is bundled in a separate archive. All these deployedservices provide their specific APIs such as Customers, Bookings, or Customer. These APIs are ready toconsume. Even the UI is also deployed separately and designed using µService. For this reason, itprovides various advantages over its monolithic counterpart. I would still remind you that there aresome exceptional cases where monolithic application development is highly successful, such as Etsy,and peer-to-peer e-commerce web applications.Now let us discuss the limitations you'd face while working with Monolithic applications.

One dimension scalabilityMonolithic applications that are large when scaled, scale everything as all the components are bundledtogether. For example, in the case of a restaurant table reservation application, even if you would like toscale the table-booking service, it would scale the whole application; it cannot scale the table-bookingservice separately. It does not utilize the resources optimally.In addition, this scaling is one-dimensional. Running more copies of the application provides the scalewith increasing transaction volume. An operation team could adjust the number of application copiesthat were using a load-balancer based on the load in a server farm or a cloud. Each of these copieswould access the same data source, therefore increasing the memory consumption, and the resulting I/Ooperations make caching less effective.Microservices gives the flexibility to scale only those services where scale is required and it allowsoptimal utilization of the resources. As we mentioned previously, when it is needed, you can scale justthe table-booking service without affecting any of the other components. It also allows two-dimensionalscaling; here we can not only increase the transaction volume, but also the data volume using caching(Platform scale).A development team can then focus on the delivery and shipping of new features, instead of worryingabout the scaling issues (Product scale).Microservices could help you scale platform, people, and product dimensions as we have seenpreviously. People scaling here refers to an increase or decrease in team size depending onmicroservices' specific development and focus needs.Microservice development using RESTful web-service development makes it scalable in the sense thatthe server-end of REST is stateless; this means that there is not much communication between servers,which makes it horizontally scalable.

Release rollback in case of failureSince monolithic applications are either bundled in the same archive or contained in a sin

Building Docker images with Maven Running Docker using Maven Integration testing with Docker Pushing the image to a registry Managing Docker containers References Summary 6. Reactive Microservices An overview of the reactive microservice architecture Responsive Resilient Elastic Message driven Implementing reactive microservices Producing an event

Related Documents:

java.io Input and output java.lang Language support java.math Arbitrary-precision numbers java.net Networking java.nio "New" (memory-mapped) I/O java.rmi Remote method invocations java.security Security support java.sql Database support java.text Internationalized formatting of text and numbers java.time Dates, time, duration, time zones, etc.

Java Version Java FAQs 2. Java Version 2.1 Used Java Version This is how you find your Java version: Start the Control Panel Java General About. 2.2 Checking Java Version Check Java version on https://www.java.com/de/download/installed.jsp. 2.3 Switching on Java Console Start Control Panel Java Advanced. The following window appears:

3. Mastering Tips 3.1 what is mastering? 3.2 typical mastering tools and effects 3.3 what can (and should) be fixed/adjusted 3.4 mastering EQ tips 3.5 mastering compressor tips 3.6 multi-band compressor / dynamic EQ 3.7 brickwall limiter 3.8 no problem, the mastering engineer will fix that!

Microservices for Java Developers What Can You Expect from This Book? This book is for Java developers and architects interested in develop‐ ing microservices. We start the book with the high-level under‐ standing and fundamental prerequisites that should be in place to be successful with a microservice architecture. Unfortunately, just

3. _ is a software that interprets Java bytecode. a. Java virtual machine b. Java compiler c. Java debugger d. Java API 4. Which of the following is true? a. Java uses only interpreter b. Java uses only compiler. c. Java uses both interpreter and compiler. d. None of the above. 5. A Java file with

Mastering Intellectual Property George W. Kuney, Donna C. Looper Mastering Labor Law Paul M. Secunda, Anne Marie Lofaso, Joseph E. Slater, Jeffrey M. Hirsch Mastering Legal Analysis and Communication David T. Ritchie Mastering Legal Analysis and Drafting George W. Kuney, Donna C. Looper Mastering Negotiable Instruments (UCC Articles 3 and 4)

Mastering Adjusting Entries 2007 Mastering Internal Controls & Fraud Prevention 2007 Mastering Inventory 2007 Mastering Correction of Accounting Errors 2007 Mastering Depreciation 2016 Mastering Payroll 2017 AH134 online F/S/SU Medical Disorders McDaniel, K

contemporary mastering techniques. The following section, "A Guide to Common Practices in Mastering," lays the groundwork for this studies' investigation of the audio mastering process. A Guide to Common Practices in Mastering To reiterate, mastering is the most misunderstood step in the recording process.